CakePHP3で半角英数のみを通すバリデーションを付けたい

バリデーションはユーザーの使いやすさやらセキュリティやらで重要な機能の1つです。

数字じゃなかったら弾くとか、空文字だったら弾くとか、いろいろあります。

ただ意外と半角英数だけ通すっていうバリデーションがありません。

そこで半角英数だけ通すカスタムバリデーションを書いていきます。

以下の記事をとても参考にしました。

CakePHP3でカスタムバリデーション作ってみた。 - またどこかでCTOっぽいことやってる人のブログ

ではやっていきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

カスタムバリデーションを記述するファイルを作る

/[アプリ名]/src/Modelディレクトリの下にValidationディレクトリを作ります。

このValidationディレクトリにCustomValidation.phpを作成します。

以下のように記述します。

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

class CustomValidation extends Validation {

      public static function alphaNumericCustom($check) {
             return (bool) preg_match('/^[a-zA-Z0-9]+$/', $check);
      }

}

Validationを継承したCustomValidationというクラスを作ります。

そしてalphaNumericCustomというファンクションを記述します。

ここで重要なポイントが2つあります。

①作成するfunctionは「static」にすること

②作成したfunctionの戻り値はbool型にすること

この2つを守らないとエラーになったり、意図通りに動かなくなります。

このpreg_matchは第一引数の正規表現に第二引数のテキストが一致していたら、trueを返してくれるファンクションです。

そして「'/^[a-zA-Z0-9]+$/'」の部分は正規表現と呼ばれます。

ざっくり言うと「英大文字A-Zの任意1文字にマッチして、英小文字a-zの任意1文字にマッチして、数字0-9の任意1文字にマッチする」という意味になります。

つまり半角英数だけ受け付けます、ということみたいです。

正規表現について詳しく知りたい方は、以下のリンクなどで調べてみてください。

【5分でまるっと理解】PHP正規表現の使い方まとめ

●●テーブルのvalidationDefaultファンクションにカスタムバリデーションを加える

validationDefaultファンクションにカスタムバリデーションを記述していきます。

検査したいテーブルである「●●Table.php」のようなファイルを開いてください。

今回はUsersTableのpassカラムにこのバリデーションを適用させます。

以下のように書きます。

public function validationDefault(Validator $validator)
    {
        $validator->provider('ProviderKey', 'App\Model\Validation\CustomValidation'); // 追加する
       (中略)
        $validator
            ->add('pass', 'alphaNumeric', [
                'rule' => ['alphaNumericCustom'], 
                'provider' => 'ProviderKey',   // カスタムバリデーション設定で書いたプロバイダのキーを入れます。
                'message' => 'パスワードは半角英数字で入力してください。']);
        (中略)
        return $validator;

passカラムに半角英数バリデーション、先ほどのバリデーションを付けました。

上の方の「$validator->provider('ProviderKey', 'App\Model\Validation\CustomValidation');」では先ほどのカスタムバリデーションとリンクさせています。

add()メソッド以降、いろいろ書かれていますね。

まずカラム名「pass」を指定します。

次にバリデーション名で、これは何でもいいみたいですが、わかりやすくalphaNumericにします。

続けてrule、provider、messageを記述します。

ruleは先ほどカスタムバリデーションクラスで書いたファンクションの名前「alphaNumericCustom」を記述します。

またproviderには上の方で書いた「ProviderKey」。

そしてmessageにはバリデーション に引っかかった際のメッセージを書きます。

これで完了となります。

実際に引っ掛けてみて試してみてください。

終わりに

以上となります。

1つ1つ書くと大変ですが、先人がすでに便利な道具を作ってくれていたので助かりました。

正規表現は自分でも書く場合があるかもしれないので、学んでおきたいです。

ありがとうございました。