Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 3.3依赖项注入更改_Php_Symfony_Dependency Injection - Fatal编程技术网

Php Symfony 3.3依赖项注入更改

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

在Synfony 3.3中,DI的新最佳实践

是使用普通构造函数依赖项注入(或“操作” 注入控制器),而不是通过 $this->get()

因此,无需指定服务,因为我们可以在类控制器中键入提示:

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注入到什么内容中,异常都不应该是服务。请参见中的“排除”。这是