【问题标题】:How to throw errors in PHP using an MVC Architecture如何使用 MVC 架构在 PHP 中抛出错误
【发布时间】:2011-08-02 21:41:16
【问题描述】:

我正在尝试重新构建我开发的使用 MVC 模式的 Web 应用程序,但我不确定如何处理错误。例如:

class AM_Products extends AM_Object 
{
    public function save( $new_data = array() ) 
    {
        // Validate input

        // Save input
    }
}

如果我传递了无效的输入来保存,我应该抛出这样的异常吗:

class AM_Products extends AM_Object 
{
    public function save( $new_data = array() ) 
    {
        // Validate input
        if ( ! validate( 'text', $new_data['name'] ) ) {
            throw new Exception( 'Invalid data entered' );
        }

        // Save input
    }
}

或者,我是否应该添加一个额外的功能并将其留给视图/控制器:

if ( $product->save( $data )->has_error() ) {
    $error = $product->get_error();
}

echo '<p>' . $error . '</p>';

【问题讨论】:

    标签: php model-view-controller architecture


    【解决方案1】:

    不要抛出异常。例外是针对特殊情况 - 输入表单的无效数据不应触发异常。

    您的模型应该有某种错误状态集,无论是在模型本身还是在各个字段上。回发应该“通过”并显示与最初显示的相同的表单,错误消息和/或突出显示的字段指示错误的位置,以便用户修复它。

    为验证抛出异常将导致系统非常脆弱且难以使用。如果您想要简单地向用户显示他们提供的字段之一无效并让他们有机会更正它会发生什么?您将如何捕获异常并知道如何显示关联的记录/表单?

    【讨论】:

    • 它适用于在视图层捕获错误(数据验证)。如果错误发生在模型层,则必须抛出异常。模型层不应该知道数据是来自 HTML 表单、Web 服务还是其他任何东西。
    • @Darhazer 这太疯狂了,完全错误。您的模型层是必须进行数据验证的地方,这是首先拥有模型的最大原因之一。您绝对不应该在视图层中进行这种验证。如果用户输入了无效的电子邮件地址,您的模型也没有理由抛出异常。这不是例外情况。
    【解决方案2】:

    抛出异常。否则,您必须记住在任何操作后始终调用 has_error/get_error。而且你会有很多重复的代码。如果错误不应该由调用save() 的方法a() 处理,而是由调用方法a() 的方法b() 处理呢?您必须从a() 返回错误,b() 也必须检查错误。

    【讨论】:

    • 我同意。我想补充一点,我总是基于 Exception() 创建一个新的 Exception 类,因此它们很容易被捕获。示例:class NoSuchProductException extends Exception {};这样您就可以} catch (NoSuchProductException $e) { 而不必依赖提供的异常文本来确定发生了什么。然后只需 throw new NoSuchProductException($productId); - 这样您就可以使用异常数据作为未找到或无法创建、验证的异常数据的指示符。
    • @Thomas 尝试更新不存在的记录与尝试使用无效信息更新记录不同,您处理每种情况的方式不一定相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多