2016-06-10 48 views
0

我有一個在我的基礎控制器的構造函數中請求的服務,以確保它始終運行。該服務檢查數據庫中的某些內容,並可能會出錯。如果出現錯誤,我想將用戶重定向到顯示此錯誤的頁面。我找不到任何方法來實現這一點,因爲重定向只能從控制器的操作中返回。我想要的是能夠從行動之外「返回」重定向。我需要做些什麼才能夠從我的服務中重定向?我需要以不同方式實施我的服務,還是根本不實行?我不想在每個操作中手動調用此方法。從Symfony中的服務重定向

相關代碼:

// Every other controller in my bundle extends this one  
class Controller extends SymfonyController 
{ 
    public function setContainer(ContainerInterface $container = null) 
    { 
     parent::setContainer($container); 

     $this->containerInitialized(); 
    } 

    protected function containerInitialized() 
    { 
     // Initialize my.service before running action of every page 
     try { 
      $this->get('my.service'); 
     } catch (SomeException $ex) { 
      // I want redirection to happen here 
     } 
    } 
} 

編輯:我知道我可以使用控制器內核事件,使一些每一頁,這就是我要使用上運行。儘管如此,這仍然不能解決重定向的問題。

+1

我會創建一個自定義的'RedirectException',你可以在你的服務中拋出,捕獲控制器。自定義異常類應該包含重定向的url。 – jszobody

+0

@jszobody我將如何從控制器實際執行此重定向?在這一點上,我們再次沒有采取行動。 – Villermen

+0

http://stackoverflow.com/questions/21576425/symfony2-redirect-in-constructor – jszobody

回答

2

服務不應該決定是否應該發生重定向或者如何處理客戶端的請求和響應。服務是爲了向控制器提供服務,可以獨立於控制器的調用方式使用。

如果您有可以觸發重定向到特定站點的服務,那麼如何在另一個控制器,另一個站點或甚至不存在重定向的命令行界面中使用該服務?你不能,那是不好的。

服務中的錯誤處理是用自定義異常完成的。如果某個服務發生無法正常繼續的情況,則會拋出一個異常來描述發生的錯誤,而不是如何處理錯誤。如何處理錯誤/異常的決定應該由控制器或命令完成,具體取決於控制器上下文的意義。如果服務可能導致不同類型的錯誤,這些不同類型應該由異常(或異常中的數據)區分,控制器可以在該異常中決定是否在某處(或否)重定向。服務或例外不應該強加給控制器應該如何處理錯誤,只能爲控制器或命令提供自己決定的信息。

+0

我同意所說的一切,除了控制器應該負責每一個響應的事實。如果您查看安全捆綁包,您會發現重定向是基於內核事件執行的,如@jszobody指出的那樣。我現在知道有一個重定向基於一個操作之外的服務(或任何真正的邏輯)發生的唯一方法是在內核事件監聽器中處理它的異常。 – Villermen