gpt4 book ai didi

php - Controller 能否捕获模型抛出的异常?

转载 作者:可可西里 更新时间:2023-11-01 12:16:51 27 4
gpt4 key购买 nike

嗯,这在技术上是可行的,但这会破坏 MVC 架构吗?

我不确定是否建议在 Controller 和模型之间进行这种类型的通信。我将使用一个简单的例子和​​两种实现方式来描述它:

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

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( Controller 完全处理异常):

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( Controller 获取模型抛出的自定义子异常,如 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');
}
}
}

最佳答案

模型可以抛出异常, Controller 或 View 应该捕获它。否则你永远不知道那里是否一切正常。所以使用第一个选项。但是确保您抛出对 Controller 和 View 有意义的正确抽象的异常

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

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

第二个例子没有显示内部错误。而是隐藏它。 Controller 不应该知道里面发生了什么。

在您的代码中,您将单个模型绑定(bind)到单个 Controller 。 Controller 不代表单个模型。它使用模型。它可以使用任意数量的模型。所以不要将单个模型与带有变量的 Controller 捆绑在一起,例如 private $model

关于php - Controller 能否捕获模型抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com