Symfony 3.3依赖注入变更

3
在Symfony 3.3中,DI的新最佳实践是使用普通的构造函数依赖注入(或者在控制器中使用"action"注入)来代替通过 $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”。
那么,在这种情况下最佳实践是什么?
谢谢。

如果我猜的话,我怀疑你的InvoiceGenerator在某种程度上依赖于HttpException。或者可能是你将MyClass注入到的任何东西。 - Cerad
1
异常不应该是服务。请参见文档中的“exclude”。这里有一个带有“exclude”的配置示例 - Tomas Votruba
1个回答

1
对于这种情况,您可能需要明确地将服务定义为\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 扩展中手动更改其定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接