在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”。
那么,这种情况下的最佳做法是什么?
感谢。
答案 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扩展中手动更改其定义。