技術的には可能ですが、これにより MVC アーキテクチャが壊れますか?
このタイプの通信がコントローラーとモデルの両方で推奨されるかどうかはわかりません。簡単な例と2つの方法を使用して説明します。
オプション 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');
}
}
}