Symfony2是否检测到服务之间的周期性依赖性?

时间:2015-12-26 18:00:29

标签: php symfony service factory

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

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

是否应该实现文档中提到的服务setter方法来启用此功能?另外,Symfony2如何处理这些鸡肉和鸡蛋问题?它会引发错误吗?

1 个答案:

答案 0 :(得分:1)

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

1)。 Install a Symfony standard edition application

我为此示例安装了 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".