Аргументы службы конфигурации пакета Symfony - PullRequest
1 голос
/ 08 июля 2019

Итак, я создал новый Bundle в Symfony, и теперь я хочу иметь конфигурацию для этого пакета. Это выглядит примерно так:

App \ DireSolutions \ TestUI \ Resources \ Config \ services.yaml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  dire_solutions.ui_test.simple_service:
    public: true
    class: App\DireSolutions\TestUI\Service\SimpleService
    arguments:
      $client_id: '123'
      $client_secret: 'secret'

App \ DireSolutions \ TestUI \ внедрение зависимости \ DireSolutionsTestUIConfiguration.php

class DireSolutionsTestUIConfiguration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('dire_solutions_test_ui');

        $rootNode
            ->children()
            ->arrayNode('twitter')
            ->children()
            ->integerNode('client_id')->end()
            ->scalarNode('client_secret')->end()
            ->end()
            ->end()// twitter
            ->end();

        return $treeBuilder;
    }
}

App \ DireSolutions \ TestUI \ внедрение зависимости \ DireSolutionsTestUIExtension.php

class DireSolutionsTestUIExtension extends Extension
{
    /**
     * @param array $configs
     * @param ContainerBuilder $container
     * @throws \Exception
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader(
            $container,
            new FileLocator(__DIR__ . '/../Resources/config')
        );
        $loader->load('services.yaml');

        $configuration = new DireSolutionsTestUIConfiguration();

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

        /** @var Definition $definition */
        $definition = $container->getDefinition('dire_solutions.ui_test.simple_service');

        $definition->setArgument('$client_id', $config['twitter']['client_id']);
        $definition->setArgument('$client_secret', $config['twitter']['client_secret']);
    }

}

App \ DireSolutions \ TestUI \ Сервис \ SimpleService.php

class SimpleService
{

    /**
     * SimpleService constructor.
     * @param ParameterBagInterface $params
     * @param string $client_id
     * @param string $client_secret
     */
    public function __construct($client_id, $client_secret)
    {
        dump($client_id);
        dump($client_secret);
        exit;
    }
}

При такой конфигурации я получаю Cannot autowire service "App\DireSolutions\TestUI\Service\SimpleService": argument "$client_id" of method "__construct()" has no type-hint, you should configure its value explicitly.

Что бы я ни менял, я не могу вручную связать эти аргументы с сервисом.

1 Ответ

0 голосов
/ 08 июля 2019

Измените ваш services.yaml на

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  App\DireSolutions\TestUI\Service\SimpleService:
    arguments:
      $client_id: "123"
      $client_secret: "secret"

Если это не сработает, вы можете попробовать явно связать аргументы с помощью

services:
      _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind: 
          $client_id: "123"
          $client_secret: "secret"

, связывание позволяет даже использовать встроенный phpтипы, такие как int, string и т. д.

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

также измените

$definition = $container>getDefinition('dire_solutions.ui_test.simple_service');

на

$definition = $container>getDefinition('App\DireSolutions\TestUI\Service\SimpleService');

или создайте псевдоним, как я упоминал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...