Symfony2是否检测服务之间的周期性依赖关系


Does Symfony2 detect cyclical dependencies between services?

假设您需要建立一个依赖于Symfony2中其他服务的复杂服务。创建这些服务的一种方法是创建工厂。

然而,是否可以在Symfony2中创建与其他服务具有周期依赖性的服务?我知道这不是一个好的编码实践,但这不是我的问题。

是否应该实现文档中提到的服务setter方法来实现这一点?否则,Symfony2如何处理这些鸡和蛋的问题?它是否抛出错误?

找到答案的最佳方法是尝试:

1) 。安装Symfony标准版应用程序

我为这个例子安装了Symfony 2.8.1

2) 。在默认的AppBundle中,在Services文件夹中添加以下文件:

ServiceA.php:

namespace AppBundle'Services;
class ServiceA
{
    private $service;
    public function __construct(ServiceB $service)
    {
        $this->service = $service;
    }
}

ServiceB.php:

namespace AppBundle'Services;
class ServiceB
{
    private $service;
    public function __construct(ServiceA $service)
    {
        $this->service = $service;
    }
}

3) 。在DependencyInjection文件夹中添加一个扩展子类:

AppExtension.php:

namespace AppBundle'DependencyInjection;
use Symfony'Component'DependencyInjection'ContainerBuilder;
use Symfony'Component'Config'FileLocator;
use Symfony'Component'DependencyInjection'Extension'Extension;
use Symfony'Component'DependencyInjection'Loader;
class AppExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new Loader'YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources'));
        $loader->load('services.yml');
    }
}

4) 。并在Resources文件夹中声明循环相关服务:

services.yml:

services:
    service_a:
        class: AppBundle'Services'ServiceA
        arguments:
            - @service_b
    service_b:
        class: AppBundle'Services'ServiceB
        arguments:
            - @service_a

在所有这些之后,如果您运行php app/console --version,您将得到以下错误:

[Symfony'Component'DependencyInjection'Exception'ServiceCircularReferenceException]
Circular reference detected for service "service_a", path: "service_a -> service_b -> service_a".