CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
2023/12/28
CakeDC/Usersの Usersテーブルへの接続、バリデーションのカスタマイズ方法解説
「CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説」の記事で、CakePHP4で CakeDC/Usersを使ってログイン認証機能を実装する手順を解説しました。
また、「CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説」の記事で、HTMLのテンプレートを変更する解説をしました。
今回の記事では、その時に解説できなかった、入力画面でのバリデーションのカスタマイズ方法について解説します。
また、CakeDC/Usersをインストールすると、CakeDC/Usersで使用する Usersテーブルの Modelは「/vendor/cakedc/users/src/Model/Table/UsersTable.php」に作成されます。
ですが、このままではアソシエーション(モデルの結合)ができません。
例えば、ユーザの詳細情報を「user_details」というテーブルに生成し、「users」テーブルと結合しようと思っても「Table class for alias Users could not be found.
」と言うエラーが発生します。
このエラーを解消し、アソシエーション(モデルの結合)をする方法を解説します。
CakeDC/Usersのバリデーションが記載されているファイル
CakeDC/Usersのバリデーションが記載されているファイルは、以下のファイルになります。
/vendor/cakedc/users/src/Model/Table/UsersTable.php
このファイルに記述されているバリデーションの内容を変更することで、バリデーションのカスタマイズを行うことは可能です。
ですが、一般的にはこのファイルはプラグイン「CakeDC/Users」のコアファイルになりますので、このファイルを直接更新することはせず、オーバーライドする処理を構築します。
CakeDC/Usersのバリデーションをオーバーライドでカスタマイズする
1./src/Application.phpの編集
下記のファイルに編集を行います。
/src/Application.php
下記の、configファイルとして「/config/users.php」を利用する処理を記述します。
1 2 3 4 5 |
// CakeDC/Usersのプラグインのロード $this->addPlugin(\CakeDC\Users\Plugin::class); // CakeDC/Usersの設定ファイル読み込み Configure::write('Users.config', ['users']); |
すでに Usersプラグインのロード処理を記述(2行目)している場合は、5行目のみ追記します。
これは、「CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説」の記事で、リダイレクトの処理の設定をする際にも記述しますので、リダイレクトなどほかの設定ですでに記述している場合もあるかと思います。
2.users.phpの編集
下記のファイルに編集を行います。該当のファイルがない場合は、新規作成をします。
/config/users.php
下記の値を編集します。
1 2 3 4 5 6 7 8 9 |
<?php use Cake\Core\Configure; use Cake\Routing\Router; $config = [ 'Users' => [ 'table' => 'Users', ], ]; return $config; |
標準設定は、「/vendor/cakedc/users/config/users.php」に下記の様に記載されています。
1 2 3 4 5 |
$config = [ 'Users' => [ //Table used to manage users 'table' => 'CakeDC/Users.Users', : |
「/config/users.php」は、「CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ」で解説をした reCAPTCHAでも利用しますので、すでに設定がある場合もあるでしょう。
3.Model/Entity/User.phpの編集
下記のファイルに編集を行います。該当のファイルがない場合は、新規作成をします。
/src/Model/Entity/User.php
下記の処理を編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Model\Entity; use CakeDC\Users\Model\Entity\User as UserParent; use Cake\Core\Configure; use Cake\I18n\Time; use Cake\ORM\Entity; use Cake\Utility\Text; use DateTime; class User extends UserParent { } |
この内容は、プラグインの Entity「/vendor/cakedc/users/src/Model/Entity/User.php」の内容を流用しています。
4.Model/Table/UsersTable.phpの編集
下記のファイルに編集を行います。該当のファイルがない場合は、新規作成をします。
/src/Model/Table/UsersTable.php
そして、ようやく、バリデーションの処理を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php namespace App\Model\Table; use CakeDC\Users\Model\Table\UsersTable as UsersTableParent; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Utility\Hash; use Cake\Validation\Validator; /** * Users Model */ class UsersTable extends UsersTableParent { public function validationDefault(Validator $validator): Validator { $validator ->allowEmptyString('id', null, 'create'); $validator ->requirePresence('username', 'create') ->notEmptyString('username'); $validator ->requirePresence('password', 'create') ->notEmptyString('password'); $validator // ->allowEmptyString('first_name'); ->notEmptyString('first_name'); $validator ->allowEmptyString('last_name'); $validator ->allowEmptyString('token'); $validator ->add('token_expires', 'valid', ['rule' => 'datetime']) ->allowEmptyDateTime('token_expires'); $validator ->allowEmptyString('api_token'); $validator ->add('activation_date', 'valid', ['rule' => 'datetime']) ->allowEmptyDateTime('activation_date'); $validator ->add('tos_date', 'valid', ['rule' => 'datetime']) ->allowEmptyDateTime('tos_date'); return $validator; } |
17行目以降の「validationDefault()」の内容は、下記のプラグインの標準設定の内容をコピペしてからカスタマイズしています。
/vendor/cakedc/users/src/Model/Table/UsersTable.php
上記の例では、32行目の処理で、「first_name」を必須項目にする、という処理に変更してみています。
これで、プラグインのファイルを触らずに、バリデーションをカスタマイズすることができるようになります。
既存のバリデーションの英語のメッセージを日本語化する
/vendor/cakedc/users/src/Model/Table/UsersTable.php
の「public function buildRules(RulesChecker $rules): RulesChecker
」には
「パスワード」と「パスワード確認用」の入力値が同じかどうかチェック
「ユーザ名」「メールアドレス」がすでに使用されていないかどうかチェック
のバリデーションも含まれています。
これもバリデーションとして使われていますが、エラーのときのメッセージが英語で表示されます。
この英語のメッセージを変更する方法の一つとして、
/src/Model/Table/UsersTable.php
に、下記の関数部分のソースコードをコピペして、エラーメッセージ部分の「Username already exists」を日本語に変えることで対応することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function buildRules(RulesChecker $rules) { $rules->add($rules->isUnique(['username']), '_isUnique', [ 'errorField' => 'username', 'message' => __d('CakeDC/Users', 'Username already exists') ]); if ($this->isValidateEmail) { $rules->add($rules->isUnique(['email']), '_isUnique', [ 'errorField' => 'email', 'message' => __d('CakeDC/Users', 'Email already exists') ]); } return $rules; } |
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
また、上記の記事では、CakePHP4全体のメッセージを日本語化する方法について記載をしています。
あわせて参考にしてください。
Usersテーブルへの接続方法
今回のこの記事の「2.users.phpの編集」から「4.Model/Table/UsersTable.phpの編集」の対応を行うことで、
/src/Model/Entity/User.php
/src/Model/Table/UsersTable.php
のファイルを使う設定、および、それぞれのファイルの作成を行いました。
これによって、Usersテーブルをアソシエーション(モデルの結合)して使うことができる様になります。
この設定がないと、上記の画面のようにエラーとなります。
「Table class for alias Users could not be found.
」
「Cake\ORM\Exception\MissingTableClassException
」
このエラーが発生したときは、「/src/Model/Entity/User.php」「/src/Model/Table/UsersTable.php」を使える様にするために、「2」から「4」の対応を行ってください。
CakePHP4のCakeDC/Usersの関連記事
CakePHP4の CakeDC/Usersを使うために、基本となるインストールの方法から入力画面のテンプレートのカスタマイズや、リダイレクトの設定など、CakeDC/Usersに関する記事を下記に書いています。
あわせて参考にしてみてください。
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakePHP4の関連記事
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3のインストールでURL rewriting……のエラーが!その解決方法解説
CakePHP3をインストールしたら URL rewriting is not properly configured.のエラーが。原因は.htaccessが有効になっていないこと。httpd.confに設定を追加すればOK。
-
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。
-
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。
-
CakePHP4で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
Bakeして自動生成した入力フォーム処理を元に少し処理を追加したら、入力エラーがあってもエラーメッセージが表示されなくなった。原因はリダイレクトの処理にあった。
-
MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認
MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。
-
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。
-
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。
-
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。および、具体的なスクレイピングを実行するサンプルソースも。
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。