CakePHP4のバリデーションではまった話
バリデーションのalphaNumericが日本語をはじかないというので
preg_matchで実装しようとしたら動作しなくて困った
最初は下記のように書いたら「The provided value is invalid」のエラーが発生
1 2 3 4 5 6 7 8 |
$validator ->scalar('password') ->add('password', 'custom', [ 'rule' => function ($value) { return preg_match("/^[0-9a-zA-Z]{4,16}$/", $value); }, 'message' => '4桁以上16桁以下の英数字で入力してください。', ]); |
色々調べてみると・・・
https://www.php.net/manual/ja/function.preg-match.php
preg_matchの戻り値
マッチした場合は1
マッチしなかった場合は0
失敗した場合はfalse
そう。マッチしない場合はfalseではない。
なので上記に書いたコードだと動作しない。
下記のように書き換えて動作確認できた!
1 2 3 4 5 6 7 8 9 10 11 12 |
$validator ->add('password', 'custom', [ 'rule' => function ($value) { $result = preg_match("/^[0-9a-zA-Z]{4,16}$/", $value); if($result == 1){ return true; } return false; }, 'message' => '4桁以上16桁以下の英数字で入力してください。', ]); |
戻り値をifで判定してreturnでちゃんと戻す。
これで1日悩んでました。