использование сервиса в сервисе в зависимости от конфигурации в стороннем пакете - PullRequest
0 голосов
/ 02 февраля 2019

Я занят переносом стороннего пакета с Symfony 3 на Symfony 4. У меня есть собственный сервис внутри этого пакета.Давайте назовем это MyService:

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;

class MyService
{
    private $params;
    private $userChecker;

    function __construct( ParameterBagInterface $params,
                          UserCheckerInterface  $userChecker )
    {
        $this->params = $params;
        $this->userChecker = $userChecker;
    }

    // ...
}

У меня проблемы со второй инъекцией 'UserCheckerInterface', которая должна внедрить другую контейнерную службу в зависимости от конфигурации моего пакета .

MyBundle /DependencyInjection / Configuration.php:

class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('fbeen_user');

        $rootNode
            ->children()
                ->scalarNode('user_checker')->defaultValue('@security.user_checker.main')->end()
            ->end()
        ;

        return $treeBuilder;
    }

}

И, наконец, внутри моего пакета services.yaml:

services:
    _defaults:
        bind:
            $userChecker: '@security.user_checker.main'

    my_bundle.my_service:
        class: MyCompany\MyBundle\Service\MyService
        arguments: ['@parameter_bag'] 
        public: true

Это работает, но если я переместу раздел _defaults: bind из службы пакета.yaml к основному service.yaml вне стороннего пакета, чем это не так.Это означает, что любой, кто использует мой сторонний пакет, все еще не может использовать другой userChecker.Я пробовал что-то вроде:

services:
    _defaults:
        bind:
            $userChecker: '@%mycompany_mybundle.user_checker%'

, но в качестве результата вместо строки выдается строка.У кого-нибудь есть подсказка для меня?

1 Ответ

0 голосов
/ 02 февраля 2019

Вы должны настроить свой сервис в классе расширения

<?php

namespace MyBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\DependencyInjection\Reference;

class MyBundleExtension extends Extension 
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

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

        $definition = $container->getDefinition('my_bundle.my_service');
        $definition->replaceArgument(1, new Reference($config["user_checker"]));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...