Можно ли получить параметры конфигурации во время прохода компилятора? У меня есть этот конфиг расширения:

my_extension:
    foo: 'bar'

Мне нужно посмотреть, установлен ли конфиг, прежде чем добавлять проход компилятора:

<?php

namespace My\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass;

class MyTestBundle extends Bundle
{
    /**
     * @param ContainerBuilder $container
     */
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        // Here I need to check if 'foo' == 'bar' from the extension config and then add the following compiler pass
        $container->addCompilerPass(
            DoctrineOrmMappingsPass::createAnnotationMappingDriver(
                [__NAMESPACE__],
                [
                    __DIR__.'/Model',
                ]
            )
        );
    }
}

Проблема в том, что во время прохождения компилятора конфигурация расширения еще не обработана: или я ошибаюсь?

0
numediaweb 27 Ноя 2019 в 17:44
Очень похоже на stackoverflow.com/questions/58877892/…
 – 
Cerad
27 Ноя 2019 в 18:19

1 ответ

Решил это с помощью передачи компилятором пакета следующим образом:

class MyTestBundle extends Bundle
{
    /**
     * @param ContainerBuilder $container
     */
    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $container->addCompilerPass(new MyTestBundleCompilerPass());
    }
}

Затем используя расширение на компиляторе, передайте так:

class MyTestBundleCompilerPass implements CompilerPassInterface
{
    /**
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasExtension(MyTestExtension::ALIAS)) {
            return;
        }

        /** @var MyTestExtension $extension */
        $extension = $container->getExtension(MyTestExtension::ALIAS);
        $config = $extension->getConfig();

        if (array_key_exists('foo', $config) && $config['foo']) {
            $container->addCompilerPass(
                DoctrineOrmMappingsPass::createAnnotationMappingDriver(
                    [__NAMESPACE__],
                    [
                        __DIR__.'/Model',
                    ]
                )
            );
        }
    }
}

Затем используя расширение для чтения конфигурации:

class MyTestExtension extends Extension
{
    const ALIAS = 'my_extension';

    private $config = array();

    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $this->config = $this->processConfiguration($configuration, $configs);

        $container->setParameter(self::ALIAS.'.foo', $this->config['foo']);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        // Extensions to override configs for
        $loader->load('config.yml');
    }

    public function getConfig()
    {
        try {
            return $this->config;
        } finally {
            // Erases the config after it is retrieved, for security and performance reasons
            $this->config = array();
        }
    }
}
0
numediaweb 5 Дек 2019 в 15:41