Php Symfony 3.3依赖项注入更改
在Synfony 3.3中,DI的新最佳实践 是使用普通构造函数依赖项注入(或“操作” 注入控制器),而不是通过 $this->get() 因此,无需指定服务,因为我们可以在类控制器中键入提示:Php Symfony 3.3依赖项注入更改,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,在Synfony 3.3中,DI的新最佳实践 是使用普通构造函数依赖项注入(或“操作” 注入控制器),而不是通过 $this->get() 因此,无需指定服务,因为我们可以在类控制器中键入提示: class InvoiceMailer { private $generator; public function __construct(InvoiceGenerator $generator) { $this->generator = $genera
class InvoiceMailer
{
private $generator;
public function __construct(InvoiceGenerator $generator)
{
$this->generator = $generator
}
// ...
}
这似乎工作得很好,但如果我扩展了一个类并在构造函数中添加了更多参数呢
use Symfony\Component\HttpKernel\Exception\HttpException;
class MyClass extends HttpException
{
private $generator;
public function __construct(InvoiceGenerator $generator, \Exception $previous = null, array $headers = [], $code = 0)
{
$this->generator = $generator;
$statusCode = $generator->getStatusCode();
$message = $generator->getTitle();
parent::__construct($statusCode, $message, $previous, $headers, $code);
}
// ...
}
现在我得到一个循环引用错误:
[Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException]
检测到服务“AppBundle\service\MyClass”路径的循环引用:“AppBundle\service\MyClass->AppBundle\service\MyClass”
那么,在这种情况下,最佳做法是什么
谢谢。对于这种情况,您可能必须将服务明确定义为
\Exception$previous
参数实际上是MyClass
(通过HttpException
)的父类,因此自动连线方法尝试再次在此参数上插入/创建MyClass
的实例,结果是:“循环引用”
这是发生在你身上的事情的抽象:
namespace App\Foo;
class MyClass extends \Exception
{
public function __construct(\Exception $previous = null)
{
}
}
相同的错误,因此您可以通过向此参数传递null
值来解决此问题:
# service.yml
services:
# ...
App\Foo\MyClass:
$previous: ~
或者在编译器过程或DI扩展中手动更改其定义。如果我不得不猜测,那么我怀疑您的InvoiceGenerator在某种程度上依赖于HttpException。或者,无论您将MyClass注入到什么内容中,异常都不应该是服务。请参见中的“排除”。这是