假设您需要依赖Symfony2中的其他服务来构建复杂的服务。创建这些服务的一种方法是创建工厂。
然而,是否有可能创建与Symfony2中的其他服务具有周期性依赖关系的服务?我知道这不是一个好的编码实践,但这不是我的问题。
是否应该实现文档中提到的服务setter
方法来启用此功能?另外,Symfony2如何处理这些鸡肉和鸡蛋问题?它会引发错误吗?
答案 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".