2011-11-21 66 views
1

我創建一個服務來獲取一些用戶數據這是正確使用的PHP異常處理/ Symfony2的

class ExampleService{ 
    // ... 
    public function getValueByUser($user) 
    { 
     $result = $this->em->getRepository('SomeBundle:SomeEntity')->getValue($user); 
     if (!$result instanceof Entity\SomeEntity) { 
      throw new Exception\InvalidArgumentException("no value found for that user"); 
     } 
     return $result; 
    } 
} 

然後在我的控制器我有

// ... 
$ExampleService = $this->get('example_serivce'); 

$value = $ExampleService->getValueByUser($user); 

我應該使用這裏的異常表明在數據庫中沒有找到該用戶的值?

如果我要,我該如何處理取之於$ExampleService->getValueByUser($user)控制器返回 - 比方說,我只是想設置一個默認值,如果沒有找到(或異常返回)

回答

1

如果你要處理的異常是由你自己決定的,然而我會在控制器中處理它(並把它扔到模型中)。如果出現錯誤,我通常會嘗試調用不同的模板以避免一堆條件,但有時您只需在模板中添加額外的邏輯即可。另外,你必須問自己這是否是一個非常特殊的情況 - 在控制器中返回null並處理返回值可能會更容易。我無法從數據對象(值,服務和用戶)中判斷這是否會一直髮生。

+0

要處理它在控制器中會把try/catch放在控制器中? – ed209

+0

是的。嘗試圍繞對getValueByUser的調用,並僅捕獲InvalidArgumentException - 您不希望捕獲您不打算訪問的異常。 – Jonathan

2

以下是我如何做到這一點。我們以用戶服務和控制器爲例。這不是在服務層異常情況 - 它只是返回的結果不檢查它:

class UserService 
{ 
    public function find($id) 
    { 
     return $this->em->getRepository('UserBundle:User')->find($id); 
    } 
} 

但在控制器層我拋出一個異常,如果被請求的用戶未發現:

class UserController 
{ 
    public function viewAction($id) 
    { 
     $user = $this->get('user.service')->find($id); 
     if (!$user) { 
      throw $this->createNotFoundException(
       $this->get('translator')->trans('user.not_found') 
      ); 
     } 
     // ... 
    } 
}