假设您需要建立一个依赖于Symfony2中其他服务的复杂服务。创建这些服务的一种方法是创建工厂。
然而,是否可以在Symfony2中创建与其他服务具有周期依赖性的服务?我知道这不是一个好的编码实践,但这不是我的问题。
是否应该实现文档中提到的服务setter
方法来实现这一点?否则,Symfony2如何处理这些鸡和蛋的问题?它是否抛出错误?
找到答案的最佳方法是尝试:
1) 。安装Symfony标准版应用程序
我为这个例子安装了Symfony 2.8.1。
2) 。在默认的AppBundle中,在Services
文件夹中添加以下文件:
ServiceA.php
:
namespace AppBundleServices;
class ServiceA
{
private $service;
public function __construct(ServiceB $service)
{
$this->service = $service;
}
}
ServiceB.php
:
namespace AppBundleServices;
class ServiceB
{
private $service;
public function __construct(ServiceA $service)
{
$this->service = $service;
}
}
3) 。在DependencyInjection
文件夹中添加一个扩展子类:
AppExtension.php
:
namespace AppBundleDependencyInjection;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentConfigFileLocator;
use SymfonyComponentDependencyInjectionExtensionExtension;
use SymfonyComponentDependencyInjectionLoader;
class AppExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new LoaderYamlFileLoader($container, new FileLocator(__DIR__.'/../Resources'));
$loader->load('services.yml');
}
}
4) 。并在Resources
文件夹中声明循环相关服务:
services.yml
:
services:
service_a:
class: AppBundleServicesServiceA
arguments:
- @service_b
service_b:
class: AppBundleServicesServiceB
arguments:
- @service_a
在所有这些之后,如果您运行php app/console --version
,您将得到以下错误:
[SymfonyComponentDependencyInjectionExceptionServiceCircularReferenceException]
Circular reference detected for service "service_a", path: "service_a -> service_b -> service_a".