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の呼び出し時に、breakOn
にfalse, 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で使用していたビヘイビアを移行される方はお気をつけください。