2017-09-21 84 views
3

在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「。

那麼,什麼是在這種情況下,最好的做法?

謝謝。

+0

如果我不得不猜測,那麼我懷疑你的InvoiceGenerator在某種程度上依賴於HttpException。或者無論你是在注入MyClass。 – Cerad

+1

異常不應該是服務。請參閱[文檔](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) –

回答

2

,看看是否有明確定義的服務爲實際上\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擴展中。