2011-11-21 121 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') 
      ); 
     } 
     // ... 
    } 
}