Symfony2 - 触发 404 异常的最佳实践
Symfony2 - Best Practices to trigger 404 exception
在 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,我不会重复异常代码。有什么更好的方法?
感谢您的回答。
你目前拥有的是好的 IMO。我目前实施的一个建议是控制器访问抛出异常的异常助手。您还可以在帮助程序中实现 try/catch,以在您不想抛出的情况下保持代码整洁。
这样做的目的是将所有字符串、日志记录以及不在同一个位置的内容保存在同一位置,以便于更新。例如,如果您要更新记录异常的方式会怎样?如果它在帮助程序中,那么它是一个简单的更改。
您必须将异常放在控制器调用的方法中,并在每个控制器中使用这些方法,这样您就不必重复代码。
您可以:
- 创建使用实体存储库的服务并处理
例外情况 (http://symfony.com/doc/current/book/service_container.html)
- 像您在示例中所做的那样将异常放入您的存储库
第一种情况提供了更清晰的代码,但增加了一点复杂性,第二种情况实施起来更快。
我通常的做法是你的代码短一些
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
在 service/repository 中抛出 HttpException 是个坏主意。如果您在命令中需要此服务,或者必须在其他示例中将它们外包,那么您的卡就坏了。
最好的解决方案是在您的服务和存储库中抛出一个(自定义)异常,或者有时 return null 或 null 对象。然后控制器可以抛出一个触发 404 页面或转发到另一个页面的 HttpException。
将 NotFoundException 转换为 404 页面是默认行为,但这可以更改。
干净的代码应该永远是你的目标,那么如果你的代码长大了或者你的需求发生了变化,你的问题就会减少。多写2行代码需要2s,但维护不好的代码可能需要几个小时。
在 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,我不会重复异常代码。有什么更好的方法?
感谢您的回答。
你目前拥有的是好的 IMO。我目前实施的一个建议是控制器访问抛出异常的异常助手。您还可以在帮助程序中实现 try/catch,以在您不想抛出的情况下保持代码整洁。
这样做的目的是将所有字符串、日志记录以及不在同一个位置的内容保存在同一位置,以便于更新。例如,如果您要更新记录异常的方式会怎样?如果它在帮助程序中,那么它是一个简单的更改。
您必须将异常放在控制器调用的方法中,并在每个控制器中使用这些方法,这样您就不必重复代码。
您可以:
- 创建使用实体存储库的服务并处理 例外情况 (http://symfony.com/doc/current/book/service_container.html)
- 像您在示例中所做的那样将异常放入您的存储库
第一种情况提供了更清晰的代码,但增加了一点复杂性,第二种情况实施起来更快。
我通常的做法是你的代码短一些
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
在 service/repository 中抛出 HttpException 是个坏主意。如果您在命令中需要此服务,或者必须在其他示例中将它们外包,那么您的卡就坏了。
最好的解决方案是在您的服务和存储库中抛出一个(自定义)异常,或者有时 return null 或 null 对象。然后控制器可以抛出一个触发 404 页面或转发到另一个页面的 HttpException。
将 NotFoundException 转换为 404 页面是默认行为,但这可以更改。
干净的代码应该永远是你的目标,那么如果你的代码长大了或者你的需求发生了变化,你的问题就会减少。多写2行代码需要2s,但维护不好的代码可能需要几个小时。