タイトルのとおりなのですが、
Save メソッドを実行する際に Controller 側から Modelに書いた Save 用のメソッドを呼び出して保存をしています。
その時に transaction 処理は controller 側に書くのが正しいのか、
それとも Model 側で処理を書くのが正しいのか。
どっちでも良いのかもしれないですが、よく分かってないです。
以下がスクリプトの例になります。(間違ってたらどうしよう。。。)
パターン1
▼Controller
if ($this->request->is('post')) { try { $this->Hoge->begin(); if ($this->Hoge->insert($this->request->data)) { if ($this->Fuga->insert($this->request->data)) { $this->Hoge->commit(); $this->redirect('/'); } else { throw new Exception('error'); } } else { throw new Exception('error'); } } } catch (Exception $e) { $this->Hoge->rollback(); }
▼Model
public function insert($data) { $this->create(); if ($this->save($data)) { $result = true; } $result = false; } return $result; }
パターン2
▼Controller
if ($this->request->is('post')) { if ($this->Hoge->insert($this->request->data)) { if ($this->Fuga->insert($this->request->data)) { $this->redirect('/'); } }
▼Model
public function insert($data) { try { $model->begin(); $model->create(); if ($model->save($data)) { $result = true; $model->commit(); } else { throw new Exception('Error'); } } catch (Exception $e) { $model->rollback(); } return $result; }
※パターン2の場合、2回目のsave時のデータが一回目のデータと紐づく場合
2回目がこけてRollbackされたら整合性が合わなくなるので、
本来のソースでは、bigin と commit のタイミングを調整しています。
ただ、そもそもそれも正しいのか分からないのですが。。。
どなた様か、こういう場合のデザインパターンはこれやー!っていうのがあればごご教示お願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。