Конфигурация многоразовых пакетов в Symfony

Я новичок в Symfony, полностью запутанном в настройке настраиваемого набора для повторного использования, который я пишу. Вначале я описал свою проблему, и все вопросы находятся в конце вопроса.

Мне нужно ввести сконфигурированный GuzzleHttp\Client в службу, живущую в комплекте. Вот конфигурация пакета:

 parameters: acl_agent.endpoint: '' services: _defaults: autowire: true autoconfigure: true public: false GuzzleHttp\Client: arguments: - [base_uri: '%acl_agent.endpoint%'] CustomBundle\Service: arguments: $client: '@GuzzleHttp\Client' 

Предполагается, acl_agent.endpoint параметр acl_agent.endpoint должен быть настроен в области хост-приложения, поэтому я налагаю его на пользователя через класс Configuration :

 class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('acl_agent'); $rootNode ->children() ->scalarNode('endpoint') ->example('https://api-gate/service/acl') ->isRequired() ->cannotBeEmpty() ->end() ->end(); return $treeBuilder; } } 

Пользователь определяет endpoint в конфигурации хоста ( app/config/config.yml ) следующим образом:

 acl_agent: endpoint: 'http://api-gate/services/acl' 

Наконец, я назначаю пользовательскую endpoint acl_agent.endpoint параметру acl_agent.endpoint в методе Extension::load :

 class AclAgentExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $configuration = $this->getConfiguration($configs, $container); $config = $this->processConfiguration($configuration, $configs); $loader = new YamlFileLoader( $container, new FileLocator(__DIR__ . '/../Resources/config') ); $loader->load('services.yml'); $container->setParameter('acl_agent.endpoint', $config['endpoint']); } } 

В конце концов, я заканчиваю пустой GuzzleHttp\Client :

 Array ( [0] => Array ( [base_uri] => ) ) 

У меня есть несколько вопросов:

  1. Как создать экземпляр и настроить GuzzleHttp\Client способом Symfony для перехода к пользовательской службе?
  2. Мне вообще нужен раздел parameters с ключом acl_agent.endpoint в параметре Resources/config/services.yml моего пакета, или я должен как-то использовать его из конфигурации хост-приложения?
  3. Почему woud объявляю раздел parameters в Resources/config/services.yml пакета, если я могу взять все параметры из конфигурации хост-приложения, если они описаны в Configuration::getConfigTreeBuilder заставляя пользователей пакета определить их ?
  4. Какова связь между параметрами области приложения хоста, Configuration::getConfigTreeBuilder и параметрами из раздела parameters определенными в конфиге пакета, если таковые имеются?
  5. Какова цель метода Extension::load и что я могу сделать в нем? Насколько я понял, он позволяет гибко настраивать мои услуги, чем я мог бы сделать в Resources/config/services.yml , возможно, что-то не хватает.

Гош, Symfony нуждается в лучшей документации.

ОБНОВЛЕНИЕ 11/11/17

Я выяснил, что в тестах использовалась старая версия кэшированного контейнера, изменения, внесенные в комплект, не были отражены в построении служб, поэтому параметр base_uri был пуст. Насколько я понял, Symfony автоматически обнаруживает изменения в конфигурациях приложения и перестраивает кеш, и мне приходится вручную перестраивать его, выполняя команду php bin/console cache:clear --env=test при изменении пакета. Правильно ли это?

Related of "Конфигурация многоразовых пакетов в Symfony"

Как создать экземпляр и настроить GuzzleHttp \ Client способом Symfony для перехода к пользовательской службе?

Вам нужно инициировать клиент как службу в config.yml следующим образом:

 guzzle: logging: true clients: your_client: base_url: "https://your_client_endpoint.com" options: headers: Accept: "application/json" timeout: 3 

После этого вы можете ввести этого клиента в свою службу через DI

 services: name_of_service: class: path_to_your_service arguments: ['@guzzle.your_client'] 

Мне вообще нужен раздел параметров с ключом acl_agent.endpoint в параметре Resource / config / services.yml моего пакета, или я должен как-то использовать его из конфигурации хост-приложения?

Да, вы можете, это будет выглядеть так:

 parameters: your_parameter: 'bla_bla_bla' services: name_of_service: class: path_to_your_service arguments: ['@guzzle.your_client', '%your_parameter%'] 

Для передачи параметров из файла config.yml в службу вы можете использовать два способа: первый – это инъекция зависимостей, посмотрите эту ссылку на инъекцию Symfony Dependency и вторую (но это плохая идея и не используйте ее) – ввести функцию обратного вызова в вашу службу.