在Synfony 3.3,爲DI新的最佳實踐Symfony的3.3依賴注入改變
是使用正常的構造函數依賴注入(或「動作」 注射控制器),而不是通過 $此獲取公共服務 - > 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 \服務\ MyClass的」 循環引用,路徑:「的appbundle \ Service \ MyClass - > AppBundle \ Service \ MyClass「。
那麼,什麼是在這種情況下,最好的做法?
謝謝。
如果我不得不猜測,那麼我懷疑你的InvoiceGenerator在某種程度上依賴於HttpException。或者無論你是在注入MyClass。 – Cerad
異常不應該是服務。請參閱[文檔](https://symfony.com/doc/current/service_container/3.3-di-changes.html#controllers-are-registered-as-services)中的「排除」。這裏是[配置示例與「排除」](https://github.com/Symplify/Symplify/blob/fe457d0bba80033d34b18ca728f8a291e0343ebc/packages/Statie/src/config/services.yml#L8) –