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,以在您不想抛出的情况下保持代码整洁。

这样做的目的是将所有字符串、日志记录以及不在同一个位置的内容保存在同一位置,以便于更新。例如,如果您要更新记录异常的方式会怎样?如果它在帮助程序中,那么它是一个简单的更改。

您必须将异常放在控制器调用的方法中,并在每个控制器中使用这些方法,这样您就不必重复代码。

您可以:

第一种情况提供了更清晰的代码,但增加了一点复杂性,第二种情况实施起来更快。

我通常的做法是你的代码短一些

    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,但维护不好的代码可能需要几个小时。