Можно ли использовать registerForAutoconfiguration внутри CompilerPass? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь упростить внедрение зависимостей в мои приложения, создав базовый класс внедрения. Пока большая часть кода работает нормально, за исключением registerForAutoconfiguration

Вот соответствующий код:

abstract class AbstractTaggedPass implements CompilerPassInterface
{
    protected $interfaceClass;
    protected $serviceClass;
    protected $tag;
    protected $method;

    public function process(ContainerBuilder $container)
    {
        // always first check if the primary service is defined
        if (!$container->has($this->serviceClass)) {
            return;
        }

        // Register classes implementing the interface with tag
        $container->registerForAutoconfiguration($this->interfaceClass)->addTag($this->tag); // Does not work

        $definition = $container->findDefinition($this->serviceClass);

        // find all service IDs with the tag
        $taggedServices = $container->findTaggedServiceIds($this->tag);

        foreach ($taggedServices as $id => $tags) {
            foreach ($tags as $attributes) {
                $definition->addMethodCall($this->method, [new Reference($id)]);
            }
        }
    }
}
class SubscriptionPaymentProviderPass extends AbstractTaggedPass
{
    protected $interfaceClass = SubscriptionPaymentProviderInterface::class
    protected $serviceClass = SubscriptionPaymentProviderPool::class;
    protected $tag = 'subscription.payment_provider';
    protected $method = 'addProvider';
}
class SubscriptionBundle extends Bundle
{
    protected function getContainerExtensionClass()
    {
        return SubscriptionExtension::class;
    }

    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        //$container->registerForAutoconfiguration(SubscriptionPaymentProviderInterface::class)->addTag('subscription.payment_provider');
        $container->addCompilerPass(new SubscriptionPaymentProviderPass());
    }
}

Если я перенесу строку registerForAutoconfiguration из Bundle класс в класс CompilerPass, то он больше не регистрирует службы с правильным тегом.

Можно ли использовать его в проходе компилятора? Нужно ли мне что-то включать, чтобы оно работало?

1 Ответ

0 голосов
/ 27 мая 2020

Compiler Pass используется после анализа определений служб (через файл конфигурации или расширения). Я думаю, что подходящее место для этого - Extension .

...