CakePHP4でカスタムバリデーションを作成する

CakePHPのバリデーション機能にて、半角英数字のバリデーションを行いたい場合、標準の機能では出来ないため、カスタムバリデーションで作成してみました。

CakePHPの半角英数字バリデーション「alphaNumeric」は日本語で使えない

CakePHPには「alphaNumeric」というルールがあるので、以下のように使用してみました。

$validator
    ->scalar('password')
    ->add('user_id', [
        'alphaNumeric' => ['rule' => 'alphaNumeric', 'message' => 'パスワードは半角英数字で入力してください。'],
    ]);

しかし、「alphaNumeric」を使用している項目で日本語を入力しても、以下のようにエラーとなりません。

そのため、カスタムバリデーションを作成して、自力で半角英数字のバリデーションをやってみます。

カスタムバリデーションのクラスを作成する

まず、本体となるカスタムバリデーションのクラスを作成します。
src\Modelに「Validation」というディレクトリを作成し、「CustomValidation.php」を作成します。
※名前は任意です。

コードは以下の通りです。

<?php
namespace App\Model\Validation;
use Cake\Validation\Validation;

/**
 * カスタムバリデーション
 */
class CustomValidation extends Validation {

    /**
     * 半角英数字バリデーション
     * @param string $value チェック対象文字列
     * @return チェックOKの場合、true
     */
    public static function isValidAlphaNumeric($value) {
        return (bool) preg_match('/^[a-zA-Z0-9]+$/', $value);
    }
}

半角英数字バリデーション用のメソッドを作成します。
中身は、正規表現で半角英数字をチェックするようにしています。

バリデーション処理にカスタムバリデーションを組み込む

続いて、作成したカスタムバリデーションを組み込みます。

    public function validationDefault(Validator $validator): Validator
    {
        $validator->setProvider('keyCustomValidation', 'App\Model\Validation\CustomValidation');

        $validator
            ->scalar('password')
            ->add('password', 'ruleAlphaNumeric', [
                'rule' => ['isValidAlphaNumeric'],
                'provider' => 'keyCustomValidation',
                'message' => 'パスワードは半角英数字で入力してください。']);

3行目で作成したカスタムバリデーションを使用する設定をします。
CakePHPではプロバイダと呼ばれます。
「keyCustomValidation」というのは、プロバイダのキー名を付けているだけなので、任意です。

9行目で、上記のキー名を指定し、8行目で対象のメソッド名を指定します。
これでカスタムバリデーションとして作成したクラスのメソッドを呼び出すことができます。