【CakePHP3.6~】フィールド同士を比較するバリデーションルール
みなさんこんにちは
暑さに負けっぱなしのyamashitaです。
以下にリストアップしてるのはCakePHP3.6の移行ガイドを読んでて気になったバリデーションルールです。
検索してもあまり出てこなかったり、頻繁に使いそうな機能に感じたため紹介したいと思います。
- equalToField
- notEqualToField
- greaterThanField
- greaterThanOrEqualToField
- lessThanField
- lessThanOrEqualToField
機能紹介
上で挙げたバリデーションルールは全て対象のフィールドとその他のフィールドを比較するルールです。
条件は名称そのままでequalToFieldならフィールド同士が同じ値、greaterThanFieldなら対象のフィールドが比較先のフィールドより大きいかといった具合です。
これらは全て第一引数にルールを追加する対象のフィールド、第二引数に比較先のフィールドを指定します。
以下は使用例です。
public function validationDefault(Validator $validator)
{
// 前略
$validator
->greaterThanField('end_date', 'start_date','終了日は開始日より後にしてください');
// 中略
return $validator;
}
フォームに何かの期間を入力する時に開始日と終了日の整合性がとることができそうです。
各ルールは名称に応じて不等号や等号が当てはめられていますので適宜使用するルールを選定してください。
単純な機能だけど今までなかったの?
このルールの追加情報を見た時に「今まではこの機能が無くてどう実現していたのだろうか?」と思いました。
調べてみるとcomparison()をカスタムバリデーションなどで使用して実現可能みたいです。
実際に今回紹介したバリデーションルールも最後にはcomparison()を内部的に使用していました。
フィールド同士を比較する処理は少なからず使用する機会があると思うので、既に同等のカスタムバリデーションが作られてなければ、コードを書くときも読むときも楽になるのではないかと思いました。
参考URL
https://api.cakephp.org/3.6/class-Cake.Validation.Validator.html