PHPでは「オーバーロード」と言うらしいので…
Model::save() メソッドをカスタマイズしたくて、AppModel中で次のように記述した。
これで、ログを出力してから、保存処理、と進んでくれると思っていたところ、実行結果は、「ヌルの許されないフィールドにヌルデータを保存しようとしました」というエラーだった。
実行された INSERT 文を見ると、確かに created, modifiedの二つに now() を入れるだけの INSERT 文になっていた。
モデルの関係は、
となっており、SampleModel 中で save() を呼び出しているが、もちろんデータは渡している。
試しに、AppModel 中の save()メソッド(上の改造をしたとこ)中で、pr($data) としてみたところ、データは入っていた。
が、parent::save として Model::save() が呼び出されたところではヌルになっている
はて…
結果は。
parent::save() は正しくコールされていた。
ただ、AppModel::save() が戻り値をちゃんと返してなかったため、コントローラが失敗と判断してエラーメッセージを表示していただけで、実際はデータが保存されていた。
下のように変更することで、期待通りの動作をした。
ミス自体は簡単だが、少し時間を食った。
Model::save() メソッドをカスタマイズしたくて、AppModel中で次のように記述した。
function save($data=null, $validate=true, $fieldList=array()) { $this->log("Saved"); parent::save($data, $validate, $fieldList); } |
これで、ログを出力してから、保存処理、と進んでくれると思っていたところ、実行結果は、「ヌルの許されないフィールドにヌルデータを保存しようとしました」というエラーだった。
実行された INSERT 文を見ると、確かに created, modifiedの二つに now() を入れるだけの INSERT 文になっていた。
モデルの関係は、
Model ← AppModel ← SampleModel |
となっており、SampleModel 中で save() を呼び出しているが、もちろんデータは渡している。
試しに、AppModel 中の save()メソッド(上の改造をしたとこ)中で、pr($data) としてみたところ、データは入っていた。
が、parent::save として Model::save() が呼び出されたところではヌルになっている
はて…
結果は。
parent::save() は正しくコールされていた。
ただ、AppModel::save() が戻り値をちゃんと返してなかったため、コントローラが失敗と判断してエラーメッセージを表示していただけで、実際はデータが保存されていた。
下のように変更することで、期待通りの動作をした。
function save($data=null, $validate=true, $fieldList=array()) { $this->log("Saved"); return parent::save($data, $validate, $fieldList); } |
ミス自体は簡単だが、少し時間を食った。