Я новичок в 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] => ) )
У меня есть несколько вопросов:
GuzzleHttp\Client
способом Symfony для перехода к пользовательской службе? parameters
с ключом acl_agent.endpoint
в параметре Resources/config/services.yml
моего пакета, или я должен как-то использовать его из конфигурации хост-приложения? parameters
в Resources/config/services.yml
пакета, если я могу взять все параметры из конфигурации хост-приложения, если они описаны в Configuration::getConfigTreeBuilder
заставляя пользователей пакета определить их ? Configuration::getConfigTreeBuilder
и параметрами из раздела parameters
определенными в конфиге пакета, если таковые имеются? Extension::load
и что я могу сделать в нем? Насколько я понял, он позволяет гибко настраивать мои услуги, чем я мог бы сделать в Resources/config/services.yml
, возможно, что-то не хватает. Гош, Symfony нуждается в лучшей документации.
ОБНОВЛЕНИЕ 11/11/17
Я выяснил, что в тестах использовалась старая версия кэшированного контейнера, изменения, внесенные в комплект, не были отражены в построении служб, поэтому параметр base_uri
был пуст. Насколько я понял, Symfony автоматически обнаруживает изменения в конфигурациях приложения и перестраивает кеш, и мне приходится вручную перестраивать его, выполняя команду php bin/console cache:clear --env=test
при изменении пакета. Правильно ли это?
Как создать экземпляр и настроить 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 и вторую (но это плохая идея и не используйте ее) – ввести функцию обратного вызова в вашу службу.