MVC/PHP:在控制器操作中处理验证和显示消息的理想方式


MVC/PHP: Ideal way to handle validations and display messages in controller action?

我和同事讨论了如何处理失败的验证并在MVC框架控制器操作中显示适当的消息。我们三个人都有不同的意见,但我认为我的方法,案例3,是处理一般错误的理想方法。这些方法的优点和缺点是什么?

情况1action()指示错误消息,如果validate()中的逻辑在其他地方使用,则必须写入新的错误消息。这似乎在某种程度上违反了单一责任原则。。

public function action()
{
    $errors = [];
    if ($this->validate($data)) {
        $errors[] = 'Check 1 failed';
    }
    // etc...
    // Display errors if $error isn't empty
}

情况2validate()会返回一个设置了不同属性的对象来检查和显示错误,这对我来说很奇怪。

public function action()
{       
    $obj = $this->validate($data);  // property 'error' set if validation fails
    if (property_exists($obj, 'error')) {
        // Display errors if 'error' property is set
    }       
}

情况3validate()返回true或抛出异常。就这么简单。

public function action()
{
    try {
        $this->validate($data); // throws some exception if fails
    } catch (Exception $e) {
        // Dispay caught error message
    }       
}
class ErrorWrapper {
    private $errors;
    public static function getAllErrors() {
        return $this->errors;
    }
    public static function attachError($error) {
        $this->errors[] = $error;
    }
}
public function validate() {
    try {
        // validation logic
    } catch('Exception $e) {
        ErrorWrapper::attachError
    }
}
public function action()
{
    $this->validate($data);
}

你可能应该试试上面的方法。基本上你的CASE3,只是在一个更MVC的模式中。