在Symfony中抛出异常的最佳做法是什么?
在文档http://symfony.com/doc/current/book/controller.html#managing-errors-and-404-pages中有一个很好的例子可以在Controller中抛出异常。
第二种方法是在模型中抛出异常,例如我有使用此方法的实体产品:
class ProductRepository extends EntityRepository
{
public function getProductBySlug($slug)
{
$product = $this->findOneBySlug($slug);
if (is_null($product )) {
throw new NotFoundHttpException(sprintf('Unable to find product : "%s".!', $slug));
}
return $product ;
}
}
如果我多次调用getProductBySlug,我将不会复制异常代码。有什么更好的方法?
感谢您的回答。
答案 0 :(得分:2)
您必须将异常放在控制器调用的方法中,并在每个控制器中使用这些方法,这样您就不必复制代码。
你可以:
第一种情况提供了更清晰的代码,但增加了一点复杂性,第二种情况更快实现。
答案 1 :(得分:2)
我的常见做法是将代码缩短一点
public function getProductBySlug($slug)
{
$product = $this->findOneBySlug($slug);
if (!$product) {
return $this->createNotFoundException("This does not exist");
}
return $product ;
}
http://api.symfony.com/2.0/Symfony/Bundle/FrameworkBundle/Controller/Controller.html
答案 2 :(得分:2)
在服务/存储库中抛出HttpException是个坏主意。如果您在命令中需要此服务或必须在其他示例中将其外包,则表示您有坏卡。
最佳解决方案是在服务和存储库中抛出(自定义)异常,或者有时返回null或null对象。然后控制器可以抛出HttpException,触发404页面或转发到另一个页面。
将NotFoundException转换为404页面是默认行为,但这可以更改。
清洁代码应始终是您的目标,如果您的代码增长或您的需求已更改,则您遇到的问题会更少。写2行代码更多需要2s,但维护不良代码可能需要数小时。
答案 3 :(得分:1)
你现在拥有的是精美的IMO。我目前实现的一个建议是控制器访问抛出异常的异常帮助器。您还可以在帮助程序中实现try / catch,以便在您不想抛出的情况下使代码保持干净。
这样做的目的是保留所有字符串,日志记录以及不在同一位置的内容以便于更新。例如,如果您要更新记录例外的方式,该怎么办?如果它在帮助器中则是一个简单的改变。