CakePHP4のメモ
17 |
830 views
CakePHP4のバリデーション機能は、フォームデータやデータベースに保存するデータの整合性を保つために欠かせません。CakePHPでは、標準で多くのバリデーションルールが提供されていますが、カスタムルールや条件付きバリデーションなど、さらに細かく設定することでデータの品質を担保できます。この記事では、CakePHP4のバリデーション設定を深堀りし、実用的な設定や応用方法を紹介します。
CakePHPのvalidationDefaultメソッドにルールを定義することで、エンティティにバリデーションルールを設定します。ここでは、必須フィールドやデータ型の指定など、基本的なバリデーションを確認します。
以下の例では、username、email、ageフィールドに対して必須やデータ型の制約を設定しています。
use Cake\Validation\Validator;
public function validationDefault(Validator $validator): Validator
{
$validator
->notEmptyString('username', 'ユーザー名は必須です')
->add('username', 'length', [
'rule' => ['minLength', 5],
'message' => 'ユーザー名は5文字以上にしてください'
])
->email('email', false, '正しいメールアドレスを入力してください')
->notEmptyString('email', 'メールアドレスは必須です')
->integer('age', '年齢は数値で入力してください')
->range('age', [18, 99], '年齢は18歳から99歳の間で入力してください');
return $validator;
}
notEmptyString:空白を許可せず、必須項目を指定。minLength:文字数の下限を設定し、短い入力を防ぎます。email:メール形式のチェックを行い、正確なメールアドレスを受け付けます。range:数値が指定の範囲内であるかを確認します。CakePHPの標準バリデーションルールだけでは対応できない特殊なチェックが必要な場合は、カスタムバリデーションを作成します。たとえば、ユーザー名が特定の文字セットに限られている場合や、特定のパターンに一致するか確認したい場合などに便利です。
カスタムバリデーションルールは、add()メソッドを使って追加できます。以下では、usernameフィールドがアルファベットと数字のみで構成されているかを確認するカスタムルールを追加しています。
$validator
->add('username', 'alphaNumeric', [
'rule' => function ($value, $context) {
return preg_match('/^[a-zA-Z0-9]+$/', $value);
},
'message' => 'ユーザー名はアルファベットと数字のみを使用してください'
]);
複数のエンティティで同じカスタムバリデーションを使用したい場合は、別途カスタムメソッドを作成し、各モデルで呼び出します。
public function validationCustomUsername(Validator $validator): Validator
{
$validator->add('username', 'alphaNumeric', [
'rule' => function ($value, $context) {
return preg_match('/^[a-zA-Z0-9]+$/', $value);
},
'message' => 'ユーザー名はアルファベットと数字のみを使用してください'
]);
return $validator;
}
validationCustomUsername()メソッドを必要なエンティティで呼び出すことで、再利用が可能になります。
CakePHP4のバリデーションには、特定の条件に基づいてバリデーションを実行する「条件付きバリデーション」があります。たとえば、あるフィールドの値に応じて他のフィールドの入力を必須にする場合などです。
以下の例では、is_adminフィールドがtrueの場合のみ、admin_codeフィールドを必須にしています。
$validator
->add('admin_code', 'requiredForAdmin', [
'rule' => function ($value, $context) {
if ($context['data']['is_admin'] === true && empty($value)) {
return false;
}
return true;
},
'message' => '管理者コードは必須です'
]);
この設定により、is_adminがtrueの場合にadmin_codeが必須となり、そうでない場合は任意フィールドとなります。
複数のフィールドの関係性に基づいてバリデーションを行う必要がある場合もあります。たとえば、start_dateがend_dateより前であるかを確認するバリデーションです。
以下では、start_dateがend_dateより前であることを確認するバリデーションを追加しています。
$validator->add('end_date', 'dateComparison', [
'rule' => function ($value, $context) {
if (!empty($context['data']['start_date']) && strtotime($value) < strtotime($context['data']['start_date'])) {
return false;
}
return true;
},
'message' => '終了日は開始日以降に設定してください'
]);
このルールにより、start_dateがend_dateより後の日付の場合、エラーが発生します。
CakePHPのバリデーションでは、フィールドごとにカスタムメッセージを設定できます。バリデーションエラーが発生した際、ユーザーにわかりやすいメッセージを表示するために役立ちます。
以下の例では、passwordフィールドのバリデーションエラーメッセージを独自に設定しています。
$validator
->notEmptyString('password', 'パスワードは必須です')
->add('password', 'minLength', [
'rule' => ['minLength', 8],
'message' => 'パスワードは8文字以上で設定してください'
])
->add('password', 'alphaNumeric', [
'rule' => 'alphaNumeric',
'message' => 'パスワードはアルファベットと数字を含めてください'
]);
CakePHP4では、バリデーションプロファイルを複数設定することが可能です。これにより、ユースケースごとに異なるバリデーションを適用することができます。たとえば、新規登録と更新で異なるルールを使用したい場合に便利です。
以下のようにvalidationForCreateとvalidationForUpdateを定義し、状況に応じて適切なバリデーションプロファイルを選択します。
public function validationForCreate(Validator $validator): Validator
{
$validator->notEmptyString('username', 'ユーザー名は必須です')
->notEmptyString('email', 'メールアドレスは必須です');
return $validator;
}
public function validationForUpdate(Validator $validator): Validator
{
$validator->notEmptyString('email', 'メールアドレスは必須です');
return $validator;
}
コントローラーでvalidationForCreateやvalidationForUpdateを選択することで、新規作成時と更新時で異なるバリデーションを適用できます。
$user = $this->Users->newEntity($this->request->getData(), ['validate' => 'forCreate']);
以下に、CakePHP4の既存のバリデーションメソッドについてまとめました。これらのメソッドはCakePHPに組み込まれており、さまざまな条件でデータの整合性をチェックするために使用できます。
notEmptyString()$validator->notEmptyString('username', 'ユーザー名は必須です');
notEmptyArray()$validator->notEmptyArray('tags', 'タグは必須です');
notBlank()$validator->notBlank('comment', 'コメントを入力してください');
notEmptyFile()$validator->notEmptyFile('file', 'ファイルをアップロードしてください');
boolean()$validator->boolean('is_active', '真偽値で入力してください');
integer()$validator->integer('age', '年齢は数値で入力してください');
numeric()$validator->numeric('price', '価格は数値で入力してください');
date()$validator->date('birthday', '正しい日付を入力してください');
dateTime()$validator->dateTime('created', '正しい日付と時間を入力してください');
time()$validator->time('meeting_time', '正しい時間を入力してください');
email()$validator->email('email', false, '正しいメールアドレスを入力してください');
minLength()$validator->minLength('password', 8, 'パスワードは8文字以上にしてください');
maxLength()$validator->maxLength('username', 20, 'ユーザー名は20文字以内で入力してください');
range()$validator->range('age', [18, 65], '年齢は18歳から65歳の間で入力してください');
lengthBetween()$validator->lengthBetween('title', [5, 100], 'タイトルは5文字以上100文字以下で入力してください');
regex()$validator->add('username', 'custom', [
'rule' => ['regex', '/^[a-z0-9_]{5,}$/i'],
'message' => 'ユーザー名は英数字とアンダースコアのみを使用してください'
]);
greaterThan()$validator->greaterThan('price', 0, '価格は0以上である必要があります');
greaterThanOrEqual()$validator->greaterThanOrEqual('stock', 1, '在庫は1以上で入力してください');
lessThan()$validator->lessThan('age', 100, '年齢は100未満で入力してください');
lessThanOrEqual()$validator->lessThanOrEqual('quantity', 10, '数量は10以下で入力してください');
equalToField()$validator->add('confirm_password', 'custom', [
'rule' => ['equalToField', 'password'],
'message' => 'パスワードが一致しません'
]);
inList()$validator->inList('status', ['active', 'inactive'], '正しいステータスを選択してください');
isArray()$validator->isArray('tags', 'タグは配列形式で入力してください');
unique()$validator->add('email', 'unique', [
'rule' => 'validateUnique',
'provider' => 'table',
'message' => 'このメールアドレスは既に登録されています'
]);
fileSize()$validator->add('profile_image', 'fileSize', [
'rule' => ['fileSize', '<=', '1MB'],
'message' => 'ファイルサイズは1MB以内である必要があります'
]);
mimeType()$validator->add('document', 'mimeType', [
'rule' => ['mimeType', ['application/pdf']],
'message' => 'PDFファイルのみアップロード可能です'
]);
uploadedFile()$validator->uploadedFile('file', [
'optional' => true,
'message' => 'ファイルのアップロードに失敗しました'
]);
allowEmptyString()$validator->allowEmptyString('middle_name');
Page 34 of 34.
1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/