CakePHP3で日本語の電話番号をValidationチェックする

Cakephp3系のデフォルトのバリデーションでは、電話番号に関するチェックがなく、手段としては下記2つ

  • 方法1:CakePHP Localized plugin(プラグインを利用する)
  • 方法2:カスタムバリデーション(自前で作る)

それでは、それぞれの方法を見ていきましょう♪

CakePHPLocalizedpluginを利用して電話番号チェック【おすすめ】

CakePHP3の公式ドキュメントにも書いてあるのですが、CakePHP Localized pluginを利用することで、国に依存するフィールドをバリデートできます。

まずは、composerでプラグインを導入します。
composer require cakephp/localized
そのあとに、CakePHP3に導入します。
bin/cake plugin load Cake/Localized
導入は以上です♪

その後は、CakePHP3のValidationの使用に合わせて記述するだけです。

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Localized\Validation\JpValidation; //日本は「Jp」
use Cake\Validation\Validator;

class AdansTable extends Table
{
  public function validationDefault(Validator $validator)
  {
    $validator
      ->scalar('name')
      ->maxLength('name', 3, '30文字以内で入力してください')
      ->requirePresence('name', 'create', '必須入力です')
      ->notEmpty('name', '必須入力です');

    //↓ここから電話番号チェック
    $validator->provider('jp', JpValidation::class); //日本は「jp」
    $validator
      ->scalar('phone')
      ->add('phone', 'myCustomRuleNameForPhone', [
        'rule' => 'phone',
        'provider' => 'jp', //日本は「jp」
        'message' => '電話番号の形式が違います'
      ])
      ->maxLength('phone', 16, '16文字以内で入力してください')
      ->requirePresence('phone', 'create', '必須入力です')
      ->notEmpty('phone', '必須入力です');
  }
}

notEmpty()の第3引数update,createとは?

バリデーションメソッドの第3引数によくある、個々のフィールドの条件を指定する(when?のやつ)ですが。

create:create実行時にフィールドが空欄であることを認めない。
update:update実行時にフィールドが空欄であることを認めない。

デフォルトでは、
false: フィールドが空欄であることを認めない。
という意味です。

CakePHP3電話番号チェックするカスタムバリデーションの作り方

cakephp/src/Model/Validation/CustomValidation.php の作成、存在しない場合は、ディレクトリごと作成する。
作る際の注意点は、
・staticなメソッドで有ること
・戻り値が、bool型で有ること

<?php
/**
 * 追加バリデーションはここに書いていく
 */
namespace App\Model\Validation;

use Cake\Validation\Validation;

class CustomValidation extends Validation
{
  /**
   * 電話番号をチェックする
   * @param array $options
   * @return bool
   */
  public static function isPhone($check, $options)
  {
    return (bool)preg_match("/^0\d{9,10}$/", str_replace("-", "", $check));
  }
}

Modelのバリデーションに、作成したCustomValidationを読み込んで使う

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;

class AdansTable extends Table
{
  public function validationDefault(Validator $validator)
  {
    $validator
      ->scalar('name')
      ->maxLength('name', 3, '30文字以内で入力してください')
      ->requirePresence('name', 'create', '必須入力です')
      ->notEmpty('name', '必須入力です');

    //↓ここから電話番号チェック
    $validator->setProvider('MyKeyName', 'App\Model\Validation\CustomValidation');
    $validator
      ->scalar('phone')
      ->add('phone', 'ruleName', [
        'rule' => 'isPhone',
        'provider' => 'MyKeyName',
        'message' => '電話番号の形式が違います'
      ])
      ->maxLength('phone', 16, '16文字以内で入力してください')
      ->requirePresence('phone', 'create', '必須入力です')
      ->notEmpty('phone', '必須入力です');  
  }
}

CakePHP3のバリデーション
CakePHP3のバリデーションには、「validationDefault」「buildRules」という2つのパターンがあります。
validationDefault に関しては、POSTデータをチェックする際のバリデーション
buildRules はsaveメソッド実行時に動き出すバリデーション
になります。

プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報エンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。