CakePHP4のバリデーションではまった話
バリデーションのalphaNumericが日本語をはじかないというので
preg_matchで実装しようとしたら動作しなくて困った
最初は下記のように書いたら「The provided value is invalid」のエラーが発生
$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ではない。
なので上記に書いたコードだと動作しない。
下記のように書き換えて動作確認できた!
$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日悩んでました。
