Как предотвратить определение псевдонима в config / services.yaml для пакета? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть пакет, который мне нравится, например, для ввода в контроллер.Единственное, что я хочу от пользователя - это зарегистрировать пакет.И тогда вы можете свободно вводить службу в любом месте:

namespace App\Bundles;

class MyService
{
    private $config;
    public function __construct(array $options)
    {
        $this->config= $options;
    }

    public function hello()
    {
        echo "Hello world";
    }
}

Я попытался определить эту строку в config / services.yaml:

App\Bundles\MyService: '@bundle_service'

Кажется, это работает,но я не хочу, чтобы пользователи делали это.

Это мой класс конфигурации:

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder("my_bundle");
        $treeBuilder->getRootNode()
            ->children()
                ->arrayNode('author')
                    ->children()
                        ->scalarNode("name")->end()
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}

И файл конфигурации my_bundle, который пока что является тестом:

my_bundle:
  author:
    name: "Name"

Класс расширения My Bundle:

class MyBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader(
            new FileLocator(__DIR__ .'/../Resources/config')
        );

        $loader->load('services.yaml');

       $configuration = new Configuration();
       $config = $this->processConfiguration($configuration, $configs);

        $container->setDefinition('bundle_service', new Definition(MyService::class, [$config]));
        $container->setAlias(MyService::class, 'bundle_service');
    }
}

Мой класс связок:

class MyBundle extends Bundle
{
    public function getContainerExtension()
    {
        return new MyBundleExtension();
    }
}

Чего мне не хватает?Все работает, за исключением того, что я должен определить эту строку App\Bundles\MyService: '@bundle_service' в config/services.yaml, что я не хочу, чтобы мои пользователи делали.В MyBundleExtension я предоставил правильное определение:

        $container->setDefinition('bundle_service', new Definition(MyService::class, [$config]));
        $container->setAlias(MyService::class, 'bundle_service');

Когда я пропускаю код config/services.yaml, я получаю эту ошибку:

Cannot autowire service "App\Bundles\MyService": argument "$options" of method "__construct()" 

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Создать сервис с переменной

services:
    # ...

    App\Updates\SiteUpdateManager:
        arguments:
            $adminEmail: '%admin_email%'

или

Создайте свой сервис с

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('my_bundle.author.name');
        // ...
    }
}
0 голосов
/ 24 апреля 2019
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');

             $container->setParameter('my_bundle.author.name', $config['author']['name']);
        }
}

Далее

Объявление службы в config / services.yaml

my_bundle.my_service.service:
    class: App\Bundles\MyService
    public: true
    arguments:
        - '%my_bundle.author.name%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...