CakePHP2.0ではBehaviorのbeforeFindメソッドで戻り値を必ず返すこと

標準

CakePHP 1.3ではBehaviorのbeforeFindメソッドで戻り値を戻さなくてもよかったのですが、CakePHP 2.0からは必ず戻さないといけません。

もし戻さなかった場合は、他のBehaviorで変更したはずの$queryの内容も元に戻ってしまいます。

条件分岐等で何も処理しなくていい場合でも、$queryを戻すようにしましょう。

コードを見てみる

当該部分のコードは以下、

https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php#L2539
Model::buildQuery()で、beforFindの呼び出し時に、breakOnfalse, nullを指定しています。ここは1.3まではfalseのみでした。

https://github.com/cakephp/cakephp/blob/master/lib/Cake/Utility/ObjectCollection.php#L108
BehaviorsCollection(ObjectCollection)のtriggerメソッドでは、beforeFindの戻り値がbreakOnの場合に、その値を返して終了します。
beforeFindの戻り値を返さない場合はnullに該当し、Model::buildQuery()にnullとして戻ります。なお、1.3以前では該当しないのでそのまま処理が続けられ、他のビヘイビアでの処理結果が反映されます。

https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php#L2542
戻り値が配列以外なら、$queryを変更せずにそのまま使用するようになっているので、呼び出されたビヘイビアのうち一つでもnullを戻した場合、それ以前の変更結果が反映されなくなります。

なお、その下の行にあるように、beforeFindの戻り値としてfalseを戻すと、find処理がキャンセルされます。

この変更は、ざっと見た限りドキュメントには載っていませんでしたので、仕様なのかバグなのか判別しがたいところですが、ビヘイビアをよく使用されている方、1.3で使用していたビヘイビアを移行される方はお気をつけください。

コメントを残す

Page optimized by WP Minify WordPress Plugin