加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 控制器可以捕获模型抛出的异常吗?

发布时间:2020-12-13 13:26:38 所属栏目:PHP教程 来源:网络整理
导读:嗯,这在技术上是可行的,但这会打破MVC架构吗? 我不确定在控制器和型号之间是否建议进行这种类型的通信.我将使用一个简单的示例和两种方法来描述它: 选项1(模型抛出异常,控制器捕获它): class Controller { private $model; public function save($data) {
嗯,这在技术上是可行的,但这会打破MVC架构吗?

我不确定在控制器和型号之间是否建议进行这种类型的通信.我将使用一个简单的示例和两种方法来描述它:

选项1(模型抛出异常,控制器捕获它):

class Controller {
  private $model;

  public function save($data) {
     try {
         $this->model->save($data); 
     } catch (Exception $e) {  
         // handle exception
     }
  }
}

class Model {
  public function save($data) {
     // Call to internal function to save data in BD
     if (! $this->_save($data)) throw new Exception('Error saving data');
  }
}

选项2(控制器完全处理异常):

class Controller {
  private $model;

  public function save($data) {
     try {
         if (! $this->model->save($data)) throw new Exception('Error saving data'); 
     } catch (Exception $e) { 
         // handle exception
     }
  }
}

class Model {
  public function save($data) {
     // Call to internal function to save data in BD
     if (! $this->_save($data)) return false;
  }
}

**

一些回复后编辑:

**

这些是根据您的建议解决它的其他方法.我希望不要让事情变得太复杂.

选项3(模型完全处理异常,正如Ray所说.KingCrunch还建议在模型中做得更好)

class Controller {
  private $model;

  public function save($data) {

     if (! $this->model->save($data)) {
         // possible action: redirect to the form with an error message
     }

  }
}

class Model {
  public function save($data) {
     try {
         if (! $this->_save($data)) throw new Exception('Error saving data'); 
     } catch (Exception $e) { 
         // handle exception
         return false;
     }
     return true; 
  }
}

选项4(控制器获取模型抛出的自定义子异常,如shiplu.mokadd.im所说.)

class Controller {
  private $model;

  public function save($data) {
     try {
         $this->model->save($data); 
     } catch (Exception $e) {  
         if ($e instanceof ValidationException) {
            // handle validation error
         }
         elseif ($e instanceof DBStorageException) {
            // handle DB error
         }
     }
  }
}

class Model {
  public function save($data) {
     if (! $this->_validate($data)) {
        throw new ValidationException ('Validation error');
     }
     if (! $this->_save($data)) {
        throw new DBStorageException ('Storage error');
     }
  }
}
模型可以抛出异常,控制器或视图应该捕获它.否则你永远不知道一切都在那里正常工作.所以使用第一个选项.但请确保您正在抛出对控制器和View有意义的正确抽象异常.

为了说明上面的粗线,请参阅模型中使用的这两个throw语句.

throw new Exception('SQL Error: '.$mysqli->error()); // dont use it
 throw new DuplicateFieldException('Duplicate username'); // use this

第二个示例未显示内部错误.相反,它隐藏了它.控制者永远不应该知道内部发生的事情.

在您的代码中,您将单个模型绑定到单个控制器.控制器不代表单个模型.它使用模型.它可以使用任意数量的模型.因此,不要将单个模型与具有变量的私有$model的控制器捆绑在一起.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读