首页 文章

Symfony 3.3依赖注入更改

提问于
浏览
3

在Synfony 3.3中,DI的最佳实践

是使用普通的构造函数依赖注入(或控制器中的“动作”注入)而不是通过$ this-> get()获取公共服务(尽管这仍然有效)

as seen in offical documentation

所以不需要指定服务,因为我们可以在类控制器中键入提示它们:

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” .

那么,这种情况下的最佳做法是什么?

谢谢 .

1 回答

  • 2

    对于这种情况,您可能必须显式定义服务,因为 \Exception $previous 参数实际上是 MyClass (通过 HttpException )的父类,因此自动装配方法尝试在此参数上再次注入/创建 MyClass 的实例,结果:"Circular Reference" .

    这是对您发生的事情的抽象:

    namespace App\Foo;
    
    class MyClass extends \Exception
    {
        public function __construct(\Exception $previous = null)
        {
        }
    }
    

    同样的错误,所以你可以解决它将 null 值传递给这个参数:

    # service.yml
    services:
        # ...
        App\Foo\MyClass: 
            $previous: ~
    

    或者在编译器传递或DI扩展中手动更改其定义 .

相关问题