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」を利用する処理を記述します。
// 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
下記の値を編集します。
<?php
use Cake\Core\Configure;
use Cake\Routing\Router;
$config = [
'Users' => [
'table' => 'Users',
],
];
return $config;
標準設定は、「/vendor/cakedc/users/config/users.php」に下記の様に記載されています。
$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
下記の処理を編集します。
<?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
そして、ようやく、バリデーションの処理を記載します。
<?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」を日本語に変えることで対応することができます。
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、CakePHP5のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
また、上記の記事では、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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
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」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する
VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。
-
-
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。
