CakePHP2,3系では、alphaNumericが、日本語を通してしまう問題がありました。
CakePHP4では、asciiAlphaNumericが用意されたため、半角英数字のみを受け入れるバリデーションが出来ます。
ここまでの過程
【参考】
- CakePHP2のalphaNumeric
 - CakePHP3のalphaNumeric
 - CakePHP4現行のalphaNumeric
 
英数字のみを受け入れるフォームを作りたいときに、CakePHPのalphaNumericバリデーションを使って実装すれば簡単だと思っていました。
しかし・・
日本語がバリデーションをスルスル通過する(泣)
調査していくと、CakePHP2,3系も同様の問題を抱えていて、例えば、2,3系では、カスタムバリデーションを自分で書いて日本語などの全角文字を防いでいたりと、他のアプローチで対応する必要がありました。
alphaNumericは、CakePHP2,3では以下のようになっています。
    public static function alphaNumeric($check)
    {
        if (empty($check) && $check !== '0') {
            return false;
        }
        return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
    }
以下が4系のalphaNumericです。
4系でもalphaNumericバリデーションは、日本語を通す挙動になっていました。
    public static function alphaNumeric($check): bool
    {
        if ((empty($check) && $check !== '0') || !is_scalar($check)) {
            return false;
        }
        return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
    }
4系のalphaNumericには、!is_scalar($check)が追加されています。
!is_scalar($check)は、値がスカラー値かどうかをチェックするメソッドです。スカラーに関しては、下記の記事が分かりやすいです。
スカラー値の判定をすることで、配列などもチェックされるようになりました。
alphaNumericとasciiAlphaNumericの違いは?
こちらがasciiAlphaNumericバリデーションです。
     public static function asciiAlphaNumeric($check): bool 
     { 
         if ((empty($check) && $check !== '0') || !is_scalar($check)) { 
             return false; 
         } 
         return self::_check($check, '/^[[:alnum:]]+$/'); 
     } 
なぜalphaNumericは、日本語が通過してしまうのだろうと思い調査してみました。
alphaNumericは内部で、/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Duという正規表現を通しています。
この正規表現は、日本語を通過してしまいます。
それに対して、asciiAlphaNumericは内部で /^[[:alnum:]]+$/という正規表現を通しています。
これにより、日本語が通過しなくなりました。
最後まで読んでくださり、ありがとうございました。