Symfony 3.3依赖注入更改

时间:2017-09-21 09:32:36

标签: php symfony dependency-injection

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

  

是使用普通的构造函数依赖注入(或“action”)   在控制器中注入)而不是通过提取公共服务   $ 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的\元器件\ DependencyInjection \异常\ ServiceCircularReferenceException]   检测到服务“AppBundle \ Service \ MyClass”的循环引用,路径:“AppBundle \ Service \ MyClass - > AppBundle \ Service \ MyClass”。

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

感谢。

1 个答案:

答案 0 :(得分: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扩展中手动更改其定义。