
Cake2でバリデーションのユニークを判定する isUnique() は rule に指定すればユニークであるか否かを実施してくれていました。
ですが、Cake4では isUnique() 自体はルールチェッカーで付属されているので、用途によって使い分ける必要あります。
単純なものならルールチェッカーで実装すればよいでしょう。複雑な検索結果でユニーク判定できるものはファインダーを利用する手もあります。
まずは、バリデート時に動的ファインダーを利用してユニーク検証をする方法です。
Cake2: isUnique バリデート
public $validate = [
'email' => [
'notBlank' => ['rule' => ['notBlank'], 'message' => '入力してください'],
'isUnique' => ['rule' => ['isUnique'], 'message' => 'すでに存在しています'],
],
];
Cake2では バリデーションに isUnique が存在していたので、上記の様に指定すればOKでした。
Cake4: 動的ファインダーを利用してユニーク判定をする
$validator->add('email', 'isUniqueEmail', [
'rule' => function ($value, $context) {
return !$this->findByEmail($value)->count();
},
'message' => ' すでに存在しています ',
]);
上記では動的ファインダーを利用して email カラムの ユニーク判定をしてみました。
次はビルドルールとして、ルールチェッカーを利用してます。
Cake4: ルールチェッカーを用いてユニーク判定させる
use Cake\ORM\RulesChecker;
/**
* ビルドルール
*
* @param \Cake\ORM\RulesChecker $rules ルールチェッカー
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->isUnique(['email'], 'すでに存在しています'));
return $rules;
}
基本的にはビルドルールを適用しておくと、Cakephp準拠的な感じがするのでベターかもしれませんね。