Cakephp PHP WEB開発

【Cakephp2→4】isUniqueバリデーションの代替

※本サイトはPR表記を含みます。

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準拠的な感じがするのでベターかもしれませんね。

-Cakephp, PHP, WEB開発
-