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



假设您需要建立一个依赖于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".

最新更新