在依赖注入类中使用参数
你已经了解了如何在 Symfony 服务容器中使用配置参数。在某些特殊情况下,例如当你想要使用 %kernel.debug%
参数来使你的 bundle 中的服务进入调试模式时。在这种情况下,为了使系统理解参数值,需要做更多的工作。默认情况下,你的参数 %kernel.debug%
将被视为字符串。考虑以下示例:
1 2 3 4 5 6 7 8 9 10 11
// inside Configuration class
$rootNode
->children()
->booleanNode('logging')->defaultValue('%kernel.debug%')->end()
// ...
->end()
;
// inside the Extension class
$config = $this->processConfiguration($configuration, $configs);
var_dump($config['logging']);
现在,仔细检查结果以查看这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
my_bundle:
logging: true
# true, as expected
my_bundle:
logging: '%kernel.debug%'
# true/false (depends on 2nd argument of the Kernel class),
# as expected, because %kernel.debug% inside configuration
# gets evaluated before being passed to the extension
my_bundle: ~
# passes the string "%kernel.debug%".
# Which is always considered as true.
# The Configurator does not know anything about
# "%kernel.debug%" being a parameter.
为了支持这种用例,Configuration
类必须通过扩展以如下方式注入此参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
namespace App\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
class Configuration implements ConfigurationInterface
{
private bool $debug;
public function __construct(private bool $debug)
{
}
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('my_bundle');
$treeBuilder->getRootNode()
->children()
// ...
->booleanNode('logging')->defaultValue($this->debug)->end()
// ...
->end()
;
return $treeBuilder;
}
}
并通过 Extension
类在 Configuration
的构造函数中设置它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
namespace App\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
class AppExtension extends Extension
{
// ...
public function getConfiguration(array $config, ContainerBuilder $container): Configuration
{
return new Configuration($container->getParameter('kernel.debug'));
}
}
提示
在 Configurator
类中,例如在 TwigBundle 中,有一些 %kernel.debug%
的用法。但是,这是因为默认参数值是由 Extension 类设置的。
本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。