標準の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
スポンサーリンク





