我创建了一个完全独立于主应用程序的软件包,因此我通过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
控制器。
但在我看来,这似乎是一种黑客攻击:有没有更优雅的方法来做到这一点?