SF 3.4在服务中注入捆绑包配置

时间:2019-08-06 14:29:51

标签: symfony symfony-3.4

使用Symfony 3.4,我只是尝试一个用于新捆绑包(名称:APiToolBundle)的简单案例。

这是src/ApiToolBundle/Resources/config/config.yml的内容:

imports:
    - { resource: parameters.yml }

api_tool:
    api_url: %myapi_url%
    api_authorization_name: 'Bearer'

此文件由ApiToolBundleExtension加载:

public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}

我也已经设置了配置文件:

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

        $rootNode
            ->children()
            ->scalarNode('api_url')->defaultValue('')->end()
            ->scalarNode('api_authorization_name')->defaultValue('')->end()
            ->end()
        ;

        return $treeBuilder;
    }
}

但是随后我只想将配置参数绑定到我的服务之一:

# src/ApiToolBundle/Resources/config/services.yml
ApiToolBundle\Service\MyApi:
  bind:
    $apiUrl: '%api_tool.api_url%'

我基于此文档:https://symfony.com/doc/3.4/bundles/configuration.html

但是我不确定所有事情,因为他们以其他方式谈论合并。我是否需要做其他事情来加载我自己的捆绑包配置文件?

1 个答案:

答案 0 :(得分:1)

这确实有点棘手。捆绑软件配置不同于您在服务配置中使用的参数(即使在配置内部,您也可以定义服务,乍看起来似乎有些奇怪)。这是为什么版本4中的Symfony不鼓励在应用程序内部使用语义配置,不使用包和配置,而是直接使用参数和服务的原因之一。

您需要将配置映射到参数,或将其直接注入到您需要它们的服务中,以防您不希望它们对其他服务公开可用或不希望使用{{1 }}。您可以在可以访问ContainerBuilder的扩展程序中执行此操作。

例如,请参阅FrameworkExtension,其中具有用于更改容器的大型配置:https://github.com/symfony/symfony/blob/v3.4.30/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php#L194-L196

在您的情况下,可能看起来像这样:

getParameter