跳到内容

在依赖注入类中使用参数

编辑此页

你已经了解了如何在 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 许可协议获得许可。
目录
    版本