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文字にマッチする」という意味になります。
つまり半角英数だけ受け付けます、ということみたいです。
正規表現について詳しく知りたい方は、以下のリンクなどで調べてみてください。
●●テーブルの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つ書くと大変ですが、先人がすでに便利な道具を作ってくれていたので助かりました。
正規表現は自分でも書く場合があるかもしれないので、学んでおきたいです。
ありがとうございました。