我是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
param应该在主机应用程序的范围内配置,因此我通过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
方法中的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
以进一步传递到自定义服务?parameters
参数中的acl_agent.endpoint
密钥的Resources/config/services.yml
部分,或者我应该以某种方式直接在主机应用程序的配置中使用它?parameters
中声明Resources/config/services.yml
部分,只要在Configuration::getConfigTreeBuilder
中强制用户描述它们用于定义它们的捆绑包?Configuration::getConfigTreeBuilder
强加的主机应用范围参数与捆绑包配置中定义的parameters
部分的参数之间的联系是什么?Extension::load
方法的目的是什么,我可能在其中做些什么?据我所知,它可以更灵活地配置我的服务然后我可以在Resources/config/services.yml
完成,我可能会遗漏一些东西。Gosh,Symfony需要更好的文档。
更新11/11/17
我已经发现在测试中使用了旧版本的缓存容器,对bundle的更改没有反映在服务的构造中,因此base_uri
param是空的。据我所知,Symfony会自动检测应用程序范围配置中的更改并重建缓存,当捆绑包更改时,我必须手动重建它,执行命令php bin/console cache:clear --env=test
。这是对的吗?
答案 0 :(得分:1)
如何通过Symfony方式实例化和配置GuzzleHttp \ Client以进一步传递给自定义服务?
您需要在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']
在我的bundle的Resources / config / services.yml参数中,我是否需要使用acl_agent.endpoint键的参数部分,或者我应该以某种方式直接在主机应用程序的配置中使用它?
是的,你可以,它看起来像:
parameters:
your_parameter: 'bla_bla_bla'
services:
name_of_service:
class: path_to_your_service
arguments: ['@guzzle.your_client', '%your_parameter%']
要将config.yml文件中的参数传递给service,可以使用两种方式,第一种是Dependency Injection,请查看此链接 Symfony Dependency injection,第二个(但这是一个坏主意,不要使用它) - 将回调函数注入您的服务。