標準のValidatorを拡張してカスタマイズする方法
拡張Validatorの組み込み
活用例
全体ルールで各フィールドにバリデーションエラーを1つのみ表示する
バリデーションエラーメッセージを共通化する
独自のバリデーションルールの読み込みを共通化する
拡張Validatorの組み込み
既存のValidatorを拡張したclassを作成します。
/src/Model/Validation/CustomValidator.php
<?php declare(strict_types=1); namespace App\Model\Validation; use Cake\Validation\Validator; /** * Validatorの拡張 * * @link https://book.cakephp.org/4/ja/core-libraries/validation.html */ class CustomValidator extends Validator { }
このclassをModel/TableやForm以下のvalidationDefaultで読み込みます。
<?php declare(strict_types=1); namespace App\Model\Table; use App\Model\Validation\CustomValidator; ……… …… ……… /** * Default validation rules. * * @param \Cake\Validation\Validator $validator Validator instance. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator): Validator { /** @var \App\Model\Validation\CustomValidator $validator */ $validator = new CustomValidator(); ……… …… ……… return $validator; }
各フィールドにバリデーションエラーを1つのみ表示する
CustomValidator.phpに下記を追記することで、各フィールドにバリデーションエラーを1つのみ表示するよう全体ルールを変更することができます。
[参考記事] 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
/** * 新しいルールをフィールドのルール セットに追加します。 * * @param string $field The name of the field from which the rule will be added * @param array|string $name The alias for a single rule or multiple rules array * @param \Cake\Validation\ValidationRule|array $rule the rule to add * @throws \InvalidArgumentException If numeric index cannot be resolved to a string one * @return $this */ public function add(string $field, $name, $rule = []) { // バリデーションエラーは各フィールドに1つのみ表示する if (!isset($rule['last'])) { $rule['last'] = true; } return parent::add($field, $name, $rule); }
標準の記法だと、全てのルールのオプションに'last' => trueを書く必要があります。
またbakeコマンドで生成されるコードでは、オプションを付けるために全てをaddメソッドに書き換える必要があります。
上記の方法だとこのような手間が1つで済みます。
$validator ->add('body', [ 'minLength' => [ 'rule' => ['minLength', 10], 'last' => true, 'message' => 'コメントには中身のある本文が必要です。', ], 'maxLength' => [ 'rule' => ['maxLength', 250], 'last' => true, 'message' => 'コメントが長すぎることはできません。' ] ]); // bakeで生成されるコードはオプションを付けるために全て書き換えが必要 $validator ->scalar('name') ->maxLength('name', 50) ->requirePresence('name', 'create') ->notEmptyString('name');
バリデーションエラーメッセージを共通化する
CustomValidator.phpに下記を追記することで、maxLengthのバリデーションエラーメッセージを共通で変更することができます。
/** * 文字列の長さの検証ルールをフィールドに追加します。 * * @param string $field The field you want to apply the rule to. * @param int $max The maximum length allowed. * @param string|null $message The error message when the rule fails. * @param callable|string|null $when Either 'create' or 'update' or a callable that returns * true when the validation rule should be applied. * @see \Cake\Validation\Validation::maxLength() * @return $this */ public function maxLength(string $field, int $max, ?string $message = null, $when = null) { if ($message === null) { $message = __('{0}文字以下で入力してください。', $max); } return parent::maxLength($field, $max, $message, $when); }
バリデーションエラーメッセージにフィールド名を追加したい場合には次のようにし、国際化i18n(多言語化)でフィールド名を変換します。
[参考記事] 国際化i18n(多言語化)
/** * フィールド名を取得する * * @param string $field The name of the field. * @return string */ private function getFieldName(string $field) { return __(ucwords(str_replace('_', ' ', preg_replace('/_id$/i', '', $field)))); } /** * 文字列の長さの検証ルールをフィールドに追加します。 * * @param string $field The field you want to apply the rule to. * @param int $max The maximum length allowed. * @param string|null $message The error message when the rule fails. * @param callable|string|null $when Either 'create' or 'update' or a callable that returns * true when the validation rule should be applied. * @see \Cake\Validation\Validation::maxLength() * @return $this */ public function maxLength(string $field, int $max, ?string $message = null, $when = null) { if ($message === null) { $message = __('{0}は{1}文字以下で入力してください。', $this->getFieldName($field), $max); } return parent::maxLength($field, $max, $message, $when); }
標準だと文字数でも型でもバリデーションエラーはほとんど「The provided value is invalid」です。
i18nのresources/locales/cake.potで定義されています。
これをそれぞれバリデーションの種類に合わせて変更するには全てのルールにメッセージを記述する必要があります。
上記の方法だとこのような手間が1ファイルで済みます。
$validator ->maxLength('name', 50, '文字数が多いです。') ->notEmptyString('name', '必須項目です。');
独自のバリデーションルールの読み込みを共通化する
CustomValidator.phpに下記を追記することで、
/src/Model/Validation/CustomValidation.php
のカスタムバリデーションを1箇所で読み込むことができます。
/** * Constructor */ public function __construct() { parent::__construct(); $this->setProvider('customValidation', 'App\Model\Validation\CustomValidation'); }
標準の記法だと、カスタムバリデーションを使う箇所全てに$this->setProvider()を書く必要があります。
関連記事
- 複数カラムのユニーク制約バリデーション
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法 CakePHP2
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP5系の入手方法・インストール方法
- CakePHP4系の入手方法・インストール方法
- CakePHP3系の入手方法・インストール方法
- CakePHP2系の入手方法・インストール方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- CakePHP1系(CakePHP1.3)の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHPのバージョンごとのシステム要件
- 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
- PHP Strict Standards: Non-static method と出る場合の対処法
- CakePHPでカラムを比較してSELECTする方法
- [CakePHPのバグ]キャッシュ処理でunlinkエラーが発生する
- 『id』以外のプライマリキーのカラム名を使用する方法
- [CakePHPのバグ]キャッシュ処理でunserializeエラーが発生する
- プライマリキーIDを連番数字ではなく推測しにくい文字列にする方法
- 複数のデータベースを切り替える方法(別データベースを使用する)
- MySQLで文字化けを防ぐ方法
- action名にlistは使えない listを使う方法
- ログイン認証処理をする方法
- CakePHP、Symfony、Zend Frameworkの比較
- CakePHPのDB接続情報設定
- ファイル読み込みPATHを設定
- デバッグレベルを設定
- セキュリティレベルの設定
- キャッシュを有効にする
- CakePHPのエラーテンプレートの一覧
- データベーステーブルを参照しないページを作る
- TOPページはIndexControllerではない Cannot redeclare config()
- ディレクトリ構成
- CakePHP
スポンサーリンク