SymfonyBundle:如何将完整捆绑配置作为服务传递给控制器​​

时间:2017-12-07 14:07:38

标签: symfony autowired

我创建了一个完全独立于主应用程序的软件包,因此我通过Composer安装它。

此捆绑包需要某种配置:

# app/config/config.yml
shq_mybundle:
    node1:
        node1_1:
            ...
        node1_2:
            ...
    node2:
        node2_1:
            ...
        node2_2:
            ...

我的捆绑包还有一个控制器MyBundleAController,此控制器有––construct()个签名:

class MyBundleAController
{
    public function __construct(EntityManagerInterface $entityManager, EventDispatcherInterface $eventDispatcher, array $config)
    {
        $this->entityManager = $entityManager;
        $this->eventDispatcher = $eventDispatcher;
        $this->config = $config;
    }
}

我的软件包还加载了一个services.yml文件,该文件使用自动装配来配置控制器:

services:
    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to d

    SerendipityHQ\Bundle\MyBundle\Controller\:
        resource: '../../Controller/*'
        public: false
        tags: ['controller.service_arguments']

显然,配置MyBundleAController的方式会引发错误,因为自动装配功能不知道$config参数,需要对参数进行类型化或显式设置:

  

无法自动连接服务   “SerendipityHQ \包\ MyBundle \控制器\ MyBundleAController”:   方法“__construct()”的参数“$ config”必须具有类型提示或   明确给出一个值。

我们在这里提出我的问题:$config参数是某人在其app/config/config.yml中设置的参数,所以这一个:

# app/config/config.yml
shq_mybundle:
    node1:
        node1_1:
            ...
        node1_2:
            ...
    node2:
        node2_1:
            ...
        node2_2:
            ...

如何将shq_mymodule配置传递给自动装配的控制器?

在第一次尝试中,我试图做这样的事情

    SerendipityHQ\Bundle\MyBundle\Controller\ConnectController:
        arguments:
            $config: "%shq_mybundle%"

但显然这不起作用。

为了使其有效,我应该在MyBundleExtension

中执行类似的操作
$container->setParameter('shq_mybundle', $config);

这样我就可以在services.yml文件中访问的参数中对其进行转换,该文件可以使用它来自动装配MyBundleAController控制器。

但在我看来,这似乎是一种黑客攻击:有没有更优雅的方法来做到这一点?

0 个答案:

没有答案