CakePHP2.5におけるValidation::inListの仕様変更について


はじめに

CakePHP2系のバージョンアップにおいて、CakePHP2.4以前とCakePHP2.5移行ではValidationメソッドの一つであるinListの仕様が若干異なるので記しておきます。

Validation::inList

2.4以前と2.5以降ではチェックの厳密さが変わっています。

2.4以前

CakePHP2.4におけるinListの実装は下記のようになっています。

public static function inList($check, $list, $strict = true) {
      return in_array($check, $list, $strict);
}

内部的には、in_array()をつかっています。defaultでは第三引数がtrueになっているので、型チェックまでを含めた厳密なチェックになっています。

2.5以降

CakePHP2.5におけるinListの実装は下記のようになっています。

public static function inList($check, $list, $caseInsensitive = false) {
     if ($caseInsensitive) {
          $list = array_map('mb_strtolower', $list);
          $check = mb_strtolower($check);
     } else {
          $list = array_map('strval', $list);
     }
     return in_array((string)$check, $list, true);
}

2.4以前と異なる大きな点として、

  • 型チェックまではしなくなった
    • in_array()を用いて判定することは変わっていませんが、チェック対象の値である$checkとリストである$listが両方文字列変換して、in_array()に渡しています。
  • 第三引数の扱い
    • 2.4以前では第三引数をtrueにした場合より厳格に型チェックをしていましたが、2.5以降の場合はtrueにした場合、Insensitiveという意味どおりよりゆるいチェックをするようになっています。

結論

CakePHP2.5以降のほうがゆるい判定になるので後方互換性は保たれた変更ではありますが、cakePHP2.4以前からバージョンを上げる際にはinListの第三引数に注意が必要そうです。