Використання параметрів у класі впровадження залежностей

Дата оновлення перекладу 2022-11-18

Використання параметрів у класі впровадження залежностей

Ви вже бачили, як використовувати параметри конфігурації у сервіс-контейнерах Symfony . Існують спеціальні випадки, коли, наприклад, ви хочете використати параметр %kernel.debug%, щоб змусити ваш пакет увійти у режим налагодження. Для такого випадку потрібно зробити більше роботи, щоб змусити систему зрозуміти значення параметра. За замовчуванням, ваш параметр %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()
;

// всередині класу Розширення
$config = $this->processConfiguration($configuration, $configs);
var_dump($config['logging']);

Теперь, рассмотрите результаты внимательнее, чтобы увидеть это:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my_bundle:
    logging: true
    # true, як очікується

my_bundle:
    logging: '%kernel.debug%'
    # true/false (залежить від 2го параметра Kernel),
    # як очікується, так як %kernel.debug% всередині конфігурації
    # оцінюється перед тим, як передається розширенню

my_bundle: ~
# передає рядок "%kernel.debug%".
# Який завжди вважається true.
# Конфігуратор не знає нічого про те, що
# "%kernel.debug%" - це параметр.

Щоб підтримати такий приклад використання, клас 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
29
30
namespace App\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    private $debug;

    public function  __construct($debug)
    {
        $this->debug = (bool) $debug;
    }

    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('my_bundle');

        $rootNode
            ->children()
                // ...
                ->booleanNode('logging')->defaultValue($this->debug)->end()
                // ...
            ->end()
        ;

        return $treeBuilder;
    }
}

І встановіть його у конструкторі Configuration через клас Extension:

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)
    {
        return new Configuration($container->getParameter('kernel.debug'));
    }
}

Tip

Існують екзепмляри використання %kernel.debug% у рамках класу Configurator, наприклад, в TwigBundle. Однак це так, тому що значення параметра за замовчуванням встановлюється класом Розширення.