我有一个services.yml
的捆绑包,其中服务定义使用class
参数的同一文件中包含的参数,如下所示:
parameters:
application.servicename.class: Application\Service\ServiceName
services:
application.servicename:
class: %application.servicename.class%
现在我想覆盖测试环境的服务类。但是,覆盖config_test.yml
中的参数不会导致覆盖类的对象被实例化。
将以下内容添加到config_test.yml
:
parameters:
application.servicename.class: Application\Mock\Service\ServiceName
...仍然会导致服务从Application\Service\ServiceName
即时发布。如果我尝试将application.servicename.class
作为参数传递给服务并将其转储到构造函数中,则会显示覆盖值Application\Mock\Service\ServiceName
。
为什么Symfony在准备服务时不尊重服务类的重写值?
答案 0 :(得分:2)
你应该移动
parameters:
application.servicename.class: Application\Service\ServiceName
从services.yml到config.yml因为在我的意见中,你将使用services.yml中的值覆盖config_test.yml中的paremeter的值
答案 1 :(得分:0)
我认为您正在寻找的是Bundle中的Extension类:
http://symfony.com/doc/current/cookbook/bundles/extension.html
我认为您可以更改加载配置文件的优先级 这是一个实现的例子
public function load(array $configs, ContainerBuilder $container {
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$container->setParameter('your.config.parameter', $config['your']['config']['parameter']);
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yml');
}
答案 2 :(得分:0)
事实证明,这个问题与Symfony加载配置无关,而是假设加载了错误的类。这个假设是由于原始服务(以及扩展它的模拟)的方法调用被标记为私有这一事实引起的。
如果这不成问题,我相信我试图做的事情应该是可能的,参考http://symfony.com/doc/2.8/cookbook/bundles/override.html#services-configuration
抱歉浪费你的时间。