Symfony2 - 触发404异常的最佳实践

时间:2015-03-11 14:23:09

标签: php symfony exception model-view-controller entity

在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,我将不会复制异常代码。有什么更好的方法?

感谢您的回答。

4 个答案:

答案 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,以便在您不想抛出的情况下使代码保持干净。

这样做的目的是保留所有字符串,日志记录以及不在同一位置的内容以便于更新。例如,如果您要更新记录例外的方式,该怎么办?如果它在帮助器中则是一个简单的改变。

相关问题