Windowsで始めるCakePHP4

CakePHP4のメモ

13

369 views

概要

CakePHP4のバリデーション機能は、フォームデータやデータベースに保存するデータの整合性を保つために欠かせません。CakePHPでは、標準で多くのバリデーションルールが提供されていますが、カスタムルールや条件付きバリデーションなど、さらに細かく設定することでデータの品質を担保できます。この記事では、CakePHP4のバリデーション設定を深堀りし、実用的な設定や応用方法を紹介します。

ステップ1:基本のバリデーション設定

CakePHPのvalidationDefaultメソッドにルールを定義することで、エンティティにバリデーションルールを設定します。ここでは、必須フィールドやデータ型の指定など、基本的なバリデーションを確認します。

1.1 必須フィールドとデータ型の指定

以下の例では、usernameemailageフィールドに対して必須やデータ型の制約を設定しています。

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:数値が指定の範囲内であるかを確認します。

ステップ2:カスタムバリデーションの追加

CakePHPの標準バリデーションルールだけでは対応できない特殊なチェックが必要な場合は、カスタムバリデーションを作成します。たとえば、ユーザー名が特定の文字セットに限られている場合や、特定のパターンに一致するか確認したい場合などに便利です。

2.1 カスタムバリデーションの定義

カスタムバリデーションルールは、add()メソッドを使って追加できます。以下では、usernameフィールドがアルファベットと数字のみで構成されているかを確認するカスタムルールを追加しています。

$validator
    ->add('username', 'alphaNumeric', [
        'rule' => function ($value, $context) {
            return preg_match('/^[a-zA-Z0-9]+$/', $value);
        },
        'message' => 'ユーザー名はアルファベットと数字のみを使用してください'
    ]);

2.2 カスタムバリデーションの再利用

複数のエンティティで同じカスタムバリデーションを使用したい場合は、別途カスタムメソッドを作成し、各モデルで呼び出します。

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()メソッドを必要なエンティティで呼び出すことで、再利用が可能になります。

ステップ3:条件付きバリデーション

CakePHP4のバリデーションには、特定の条件に基づいてバリデーションを実行する「条件付きバリデーション」があります。たとえば、あるフィールドの値に応じて他のフィールドの入力を必須にする場合などです。

3.1 条件付きバリデーションの実装

以下の例では、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_admintrueの場合にadmin_codeが必須となり、そうでない場合は任意フィールドとなります。

ステップ4:複数フィールドを組み合わせたバリデーション

複数のフィールドの関係性に基づいてバリデーションを行う必要がある場合もあります。たとえば、start_dateend_dateより前であるかを確認するバリデーションです。

4.1 開始日と終了日の整合性をチェック

以下では、start_dateend_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_dateend_dateより後の日付の場合、エラーが発生します。

ステップ5:カスタムメッセージとフィールドごとの設定

CakePHPのバリデーションでは、フィールドごとにカスタムメッセージを設定できます。バリデーションエラーが発生した際、ユーザーにわかりやすいメッセージを表示するために役立ちます。

5.1 フィールドごとのカスタムメッセージ設定

以下の例では、passwordフィールドのバリデーションエラーメッセージを独自に設定しています。

$validator
    ->notEmptyString('password', 'パスワードは必須です')
    ->add('password', 'minLength', [
        'rule' => ['minLength', 8],
        'message' => 'パスワードは8文字以上で設定してください'
    ])
    ->add('password', 'alphaNumeric', [
        'rule' => 'alphaNumeric',
        'message' => 'パスワードはアルファベットと数字を含めてください'
    ]);

ステップ6:バリデーションプロファイルを活用する

CakePHP4では、バリデーションプロファイルを複数設定することが可能です。これにより、ユースケースごとに異なるバリデーションを適用することができます。たとえば、新規登録と更新で異なるルールを使用したい場合に便利です。

6.1 バリデーションプロファイルの定義

以下のようにvalidationForCreatevalidationForUpdateを定義し、状況に応じて適切なバリデーションプロファイルを選択します。

public function validationForCreate(Validator $validator): Validator
{
    $validator->notEmptyString('username', 'ユーザー名は必須です')
              ->notEmptyString('email', 'メールアドレスは必須です');

    return $validator;
}

public function validationForUpdate(Validator $validator): Validator
{
    $validator->notEmptyString('email', 'メールアドレスは必須です');
    return $validator;
}

コントローラーでvalidationForCreatevalidationForUpdateを選択することで、新規作成時と更新時で異なるバリデーションを適用できます。

$user = $this->Users->newEntity($this->request->getData(), ['validate' => 'forCreate']);

CakePHP4の既存バリデーションメソッド一覧

以下に、CakePHP4の既存のバリデーションメソッドについてまとめました。これらのメソッドはCakePHPに組み込まれており、さまざまな条件でデータの整合性をチェックするために使用できます。


CakePHP4の既存バリデーションメソッド一覧

基本的なバリデーションメソッド

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()

  • 説明:日付形式(Y-m-d)のチェックを行います。
  • 使用例
    $validator->date('birthday', '正しい日付を入力してください');

dateTime()

  • 説明:日付と時間が正しい形式であるかを確認します。
  • 使用例
    $validator->dateTime('created', '正しい日付と時間を入力してください');

time()

  • 説明:時間(HH:MM:SS)の形式を確認します。
  • 使用例
    $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()

  • 説明:ファイルのMIMEタイプを確認します(画像やPDFなどのチェックに便利)。
  • 使用例
    $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/

ツイッター

@darkimpact0626