我目前正在尝试找到一个可靠的解决方案来动态更改 Symfony2 服务的依赖关系。详细信息:我有一个服务,它使用 HTTP 驱动程序与外部 API 进行通信。
class myAwesomeService
{
private $httpDriver;
public function __construct(
HTTDriverInterface $httpDriver
) {
$this->httpDriver = $httpDriver;
}
public function transmitData($data)
{
$this->httpDriver->dispatch($data);
}
}
在 CI 上运行 Behat 测试时,我想使用 httpMockDriver 而不是真正的驱动程序,因为外部 API 可能会关闭、缓慢甚至损坏,而且我不想破坏构建。
目前我正在做这样的事情:
<?php
namespace MyAwesome\TestBundle\DependencyInjection;
class MyAwesomeTestExtension extends Extension
{
/**
* {@inheritDoc}
*/
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'));
$environment = //get environment
if ($environment == 'test') {
$loader->load('services_mock.yml');
} else {
$loader->load('services.yml');
}
}
}
这目前有效,但肯定会崩溃。那么,是否有更优雅/可靠的方法来动态更改 HTTPDriver?
我终于找到了一个对我来说看起来很可靠的解决方案。从 Symfony 2.4 开始,您可以使用表达式语法:使用表达语言 http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
所以我这样配置了我的服务。
service.yml
parameters:
httpDriver.class: HTTP\Driver\Driver
httpMockDriver.class: HTTP\Driver\MockDriver
myAwesomeService.class: My\Awesome\Service
service:
myAwesomeService:
class: "%myAwesomeService.class%"
arguments:
- "@=service('service_container').get('kernel.environment') == 'test'? service('httpMockDriver) : service('httpDriver)"
这对我有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)