2013-10-04 35 views
3

我使用的Symfony2我的web項目,我有幾個控制器,具有完全相同的try catch塊處理同一個try catch結構中的每個控制器

<?php 

class MyBaseController extends Controller { 
    private $manager = new MyManager(); 
    // Some generic stuff 
} 

class MyController1 extends MyBaseController { 
    try { 
     $manager->one();   
    } 
    catch (Exception $e) { 
     return $this->someOtherMessage(); 
    } 
} 

class MyController2 extends MyBaseController { 
    try { 
     $manager->two();   
    } 
    catch (Exception $e) { 
     return $this->someOtherMessage(); 
    } 
} 

class MyController3 extends MyBaseController { 
    try { 
     $manager->three();  
    } 
    catch (Exception $e) { 
     return $this->someOtherMessage(); 
    } 
} 

我怎麼能寫這樣避免了這麼多複製?

+0

他們只是不同的方法 –

回答

1

如果每個控制器都可能發送一個特定的異常,那麼您的控制器中的每種方法都不需要try/catch塊。
我看到兩種方法來處理這個問題。

首先,如果這是一個可引發的全局異常,並且您只想渲染另一條消息而不是默認的500錯誤消息。您可以override給出的默認模板,通過在app/Resources文件夾

創建自己的error500.html.twig另一種方法來處理它是創建一個自定義異常與event listener並列。
我會創建自己的異常,如ManagerException,這將由事件偵聽器處理。

class ManagerException extends Exception {} 

您的經理現在會拋出此異常。
注:因爲它擴展了該基地例外

class RuntimeManagerException extends ManagerException {} 

然後你就可以宣佈你的事件偵聽器

services.yml您可以創建你想要只要任何異常

​​

阿克米\ FooBundle \監聽\ ManagerExceptionListener

use Symfony\Component\Templating\EngineInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\Response; 

class ManagerExceptionListener 
{ 
    protected $twig; 

    public function __construct(EngineInterface $twig) 
    { 
     $this->twig = $twig; 
    } 

    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $exception = $event->getException(); 

     if (!($exception instanceof ManagerException)) { 
      return; 
     } 

     $response = new Response; 
     $response->setContent($this->twig->render('errorpage.html.twig')); 

     $event->setResponse($response); 
    } 
} 
+0

是services.yml文件嗎?通常我已經看到了從服務中縮進兩級的「類」,「參數」和「標籤」... –

+1

@Dbugger真的,我糾正了 – Touki

相關問題