我和同事讨论了如何处理失败的验证并在MVC框架控制器操作中显示适当的消息。我们三个人都有不同的意见,但我认为我的方法,案例3,是处理一般错误的理想方法。这些方法的优点和缺点是什么?
情况1:action()
指示错误消息,如果validate()
中的逻辑在其他地方使用,则必须写入新的错误消息。这似乎在某种程度上违反了单一责任原则。。
public function action()
{
$errors = [];
if ($this->validate($data)) {
$errors[] = 'Check 1 failed';
}
// etc...
// Display errors if $error isn't empty
}
情况2:validate()
会返回一个设置了不同属性的对象来检查和显示错误,这对我来说很奇怪。
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
}
}
情况3:validate()
返回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的模式中。