Використання параметрів у класі впровадження залежностей
Дата оновлення перекладу 2023-08-25
Використання параметрів у класі впровадження залежностей
Ви вже бачили, як використовувати параметри конфігурації у
сервіс-контейнерах 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']);
Теперь, рассмотрите результаты внимательнее, чтобы увидеть это:
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
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;
}
}
І встановіть його у конструкторі 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): Configuration
{
return new Configuration($container->getParameter('kernel.debug'));
}
}
Tip
Існують екзепмляри використання %kernel.debug%
у рамках класу
Configurator
, наприклад, в TwigBundle. Однак це так, тому що значення
параметра за замовчуванням встановлюється класом Розширення.