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

前端之家收集整理的这篇文章主要介绍了php – 控制器可以捕获模型抛出的异常吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
嗯,这在技术上是可行的,但这会打破MVC架构吗?

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

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

  1. class Controller {
  2. private $model;
  3.  
  4. public function save($data) {
  5. try {
  6. $this->model->save($data);
  7. } catch (Exception $e) {
  8. // handle exception
  9. }
  10. }
  11. }
  12.  
  13. class Model {
  14. public function save($data) {
  15. // Call to internal function to save data in BD
  16. if (! $this->_save($data)) throw new Exception('Error saving data');
  17. }
  18. }

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

  1. class Controller {
  2. private $model;
  3.  
  4. public function save($data) {
  5. try {
  6. if (! $this->model->save($data)) throw new Exception('Error saving data');
  7. } catch (Exception $e) {
  8. // handle exception
  9. }
  10. }
  11. }
  12.  
  13. class Model {
  14. public function save($data) {
  15. // Call to internal function to save data in BD
  16. if (! $this->_save($data)) return false;
  17. }
  18. }

**

一些回复后编辑:

**

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

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

  1. class Controller {
  2. private $model;
  3.  
  4. public function save($data) {
  5.  
  6. if (! $this->model->save($data)) {
  7. // possible action: redirect to the form with an error message
  8. }
  9.  
  10. }
  11. }
  12.  
  13. class Model {
  14. public function save($data) {
  15. try {
  16. if (! $this->_save($data)) throw new Exception('Error saving data');
  17. } catch (Exception $e) {
  18. // handle exception
  19. return false;
  20. }
  21. return true;
  22. }
  23. }

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

  1. class Controller {
  2. private $model;
  3.  
  4. public function save($data) {
  5. try {
  6. $this->model->save($data);
  7. } catch (Exception $e) {
  8. if ($e instanceof ValidationException) {
  9. // handle validation error
  10. }
  11. elseif ($e instanceof DBStorageException) {
  12. // handle DB error
  13. }
  14. }
  15. }
  16. }
  17.  
  18. class Model {
  19. public function save($data) {
  20. if (! $this->_validate($data)) {
  21. throw new ValidationException ('Validation error');
  22. }
  23. if (! $this->_save($data)) {
  24. throw new DBStorageException ('Storage error');
  25. }
  26. }
  27. }
模型可以抛出异常,控制器或视图应该捕获它.否则你永远不知道一切都在那里正常工作.所以使用第一个选项.但请确保您正在抛出对控制器和View有意义的正确抽象异常.

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

  1. throw new Exception('sql Error: '.$MysqLi->error()); // dont use it
  2. throw new DuplicateFieldException('Duplicate username'); // use this

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

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

猜你在找的PHP相关文章