在Symfony中配置可重用捆绑包

时间:2017-11-09 20:32:13

标签: php 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 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] => 
        )

)

我有几个问题:

  1. 如何通过Symfony方式实例化和配置GuzzleHttp\Client以进一步传递到自定义服务?
  2. 我是否需要使用我的捆绑包parameters参数中的acl_agent.endpoint密钥的Resources/config/services.yml部分,或者我应该以某种方式直接在主机应用程序的配置中使用它?
  3. 如果我可以从主机应用程序的配置中获取所有参数,我为什么要在包parameters中声明Resources/config/services.yml部分,只要在Configuration::getConfigTreeBuilder中强制用户描述它们用于定义它们的捆绑包?
  4. Configuration::getConfigTreeBuilder强加的主机应用范围参数与捆绑包配置中定义的parameters部分的参数之间的联系是什么?
  5. Extension::load方法的目的是什么,我可能在其中做些什么?据我所知,它可以更灵活地配置我的服务然后我可以在Resources/config/services.yml完成,我可能会遗漏一些东西。
  6. Gosh,Symfony需要更好的文档。

    更新11/11/17

    我已经发现在测试中使用了旧版本的缓存容器,对bundle的更改没有反映在服务的构造中,因此base_uri param是空的。据我所知,Symfony会自动检测应用程序范围配置中的更改并重建缓存,当捆绑包更改时,我必须手动重建它,执行命令php bin/console cache:clear --env=test。这是对的吗?

1 个答案:

答案 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,第二个(但这是一个坏主意,不要使用它) - 将回调函数注入您的服务。