Lui*_*tin 9 php model-view-controller controller model exception
嗯,这在技术上是可行的,但这会打破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');
}
}
Run Code Online (Sandbox Code Playgroud)
选项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;
}
}
Run Code Online (Sandbox Code Playgroud)
**
**
这些是根据您的建议解决它的其他方法.我希望不要让事情变得太复杂.
选项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;
}
}
Run Code Online (Sandbox Code Playgroud)
选项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');
}
}
}
Run Code Online (Sandbox Code Playgroud)
模型可以抛出异常,控制器或视图应该捕获它.否则你永远不知道一切都在那里正常工作.所以使用第一个选项.但请确保您正在抛出对控制器和View有意义的正确抽象异常.
为了说明上面的粗线,请参阅模型中使用的这两个throw语句.
throw new Exception('SQL Error: '.$mysqli->error()); // dont use it
throw new DuplicateFieldException('Duplicate username'); // use this
Run Code Online (Sandbox Code Playgroud)
第二个示例未显示内部错误.相反,它隐藏了它.控制者永远不应该知道内部发生了什么.
在您的代码中,您将单个模型绑定到单个控制器.控制器不代表单个模型.它使用模型.它可以使用任意数量的模型.因此,不要将单个模型与具有变量的控制器绑定private $model
.
归档时间: |
|
查看次数: |
6475 次 |
最近记录: |