CakePHP3を使ってバリデーションを書いていたのですが「The provided value is invalid」とでてしまって
思ったとおりのバリデーションエラーの文言がでなかったので原因を調べてみました。
環境
PHPのバージョン…5.6.35
CakePHPのバージョン…3.6.3
事の発端
とあるモデルに以下のように記述をし動かし確認したところ
「The provided value is invalid」とでてしまって思ったとおりの文言が表示されませんでした。
public function validationDefault(Validator $validator) { ... $validator ... ->email('address', 'メールアドレスを正しく入力してください'); }
いざ調査
emailというバリデーションメソッドの使い方をちゃんと調べようと思いファイルを漁ったところ、
src\Validation\Validator.phpにいろいろ書いてありました。
/** * Add an email validation rule to a field. * * @param string $field The field you want to apply the rule to. * @param bool $checkMX Whether or not to check the MX records. * @param string|null $message The error message when the rule fails. * @param string|callable|null $when Either 'create' or 'update' or a callable that returns * true when the validation rule should be applied. * @see \Cake\Validation\Validation::email() * @return $this */ public function email($field, $checkMX = false, $message = null, $when = null) { $extra = array_filter(['on' => $when, 'message' => $message]); return $this->add($field, 'email', $extra + [ 'rule' => ['email', $checkMX] ]); }
たくさんの引数を指定することができるんだなーと思いつつも
google先生に翻訳をお願いしたところ以下のようなことが書いてあるみたいです。
フィールドに電子メール検証ルールを追加します。
@param string $fieldルールを適用するフィールドです。
@param bool $checkMX MXレコードをチェックするかどうか。
@param string | null $messageルールが失敗したときのエラーメッセージ。
@param string | callable | null $when ‘create’または ‘update’または返す呼び出し可能
検証規則を適用する必要がある場合はtrue。
@see \Cake\Validation\Validation::email()
@return $this
余談ですがgoogle翻訳って前より優秀になりましたね。びっくりしました。
原因と解決方法
原因はこの記述のemailメソッドの使い方です。
public function validationDefault(Validator $validator) { ... $validator ... ->email('address', 'メールアドレスを正しく入力してください'); }
2つめの引数にはMXレコードをチェックするかどうかを入れる必要があるのですが
出力したいメッセージを入れていたためtrueと判断され思ったとおりの文言が表示されなかった、ということでした。
以下のように2つめの引数にはMXレコードをチェックするかどうか(今回はfalse)、
3つめの引数には出力したいメッセージを指定します。
public function validationDefault(Validator $validator) { ... $validator ... ->email('address', false, 'メールアドレスを正しく入力してください'); }
実行してみたところ、
意図したとおりの文言が表示されました!
まとめ
・バリデーションに追加する定義を行っているファイルはsrc\Validation\Validator.php
・emailメソッドの2つめの引数は出力したいメッセージを記述するのではなくMXレコードをチェックするかどうかを記述する
無知って怖いなとしみじみ思いました。
今回はemailメソッドでしたが、他のメソッドでも意図したとおりのバリデーションエラーがでない場合は
src\Validation\Validator.phpを確認し修正を行えば良いですね。
WEBアプリケーション関連 人気連載リンク
基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載
より実践的なWEBアプリ開発講座!Bootstrap活用を学ぶなら・・
魁!小野の塾 連載