CakePHPで電話番号を登録するための正規表現を使った雛形コード

CakePHPで電話番号を登録するための正規表現を使った雛形コード

42 回閲覧されました

みなさんこんにちは、jonioです。

今回は電話番号を登録する時にハイフンを含んで登録することができる雛形のコードを解説します。

CakePHPのバージョン

4.5.4で確認しましたが3系でも動くかもしれません。

対応できる電話番号の形式

06-1234-5678みたいなハイフンつなぎの形式に対応しています。

(06)1234-5678みたいなカッコには対応していません、正規表現を使っていますがカッコを使いたい場合は正規表現を変えないといけないです。

06の612345678は場合によっては入る数字の数が変わるので下記の対応をしています。(先頭の0は固定にしています)

  • 6 : 1つ〜3つ
  • 1234 : 3つか4つ
  • 5678 : 3つか4つ

それでは実装しましょう。

CompaniesTable.php(モデル)

テーブル名をcompanies・電話番号を登録するカラム名をtel・データ型をstringとします。

CompaniesTable.phpのvalidationDefaultメソッドの中に下記の記述をします。

public function validationDefault(Validator $validator): Validator
{



  $validator
    ->scalar('tel') 
    ->maxLength('tel', 20) 
    ->requirePresence('tel', 'create')
    ->notEmptyString('tel')
    ->add('tel', 'custom', [
      'rule' => function ($value, $context) {
         $pattern = '/^0\d{1,3}-\d{3,4}-\d{3,4}$/';
         return (bool)preg_match($pattern, $value);
       },
       'message' => '正しい電話番号形式ではありません。'
    ]);

コードの説明

13行目は正規表現です、電話番号が今回考えている形式に当てはまるようにしています。

14行目のpreg_matchは正規表現の判定に使います。

書き方は下記になります。

preg_match(正規表現の型, フォームに入力した値);

正規表現の型は13行目のことです。

フォームに入力した値が正規表現の型に当てはまっている場合は1を返して当てはまらない場合は0を返します。

そしてpreg_matchの前に「(bool)」をつけることでpreg_matchが1の時はtrueになって0の時はfalseになり16行目のエラーメッセージが表示されます。

12行目の「$context」はなくても実装ですが記述すると細かいバリデーションが可能になります。

電話番号をただ登録したい場合は$contextはつけなくていいです。

試しにdd関数を使って何が取得できているかを調べます。

->add('tel', 'custom', [
  'rule' => function ($value, $context) {

    dd($context);      //この行を追加

    $pattern = '/^0\d{1,3}-\d{3,4}-\d{3,4}$/';
                    
    return (bool)preg_match($pattern, $value);
  },
  'message' => '正しい電話番号形式ではありません。'
]);

結果は下記になります。

[
  'newRecord' => true,
  'data' => [
    'name' => 'デモ会社名',
    'kana' => 'でもかいしゃめい',
    'tel' => '1111111',
    'manager' => 'デモマネージャー',
    'mail' => 'a@demo.com',
    'created_at' => '2024-05-17T19:45:57',
    'updated_at' => '2024-05-03T19:46',
  ],
  'field' => 'tel',
  'providers' => [
    'table' => object(App\Model\Table\CompaniesTable) id:0 { },
    'default' => object(Cake\Validation\RulesProvider) id:1 { },
  ],
]

「newRecord」・「data」・「field」・「providers」の4つの項目を確認できます。

newRecord

レコードが新しく作成できたかを確認できます、コードを下記にすると確認できます。

->add('tel', 'custom', [
  'rule' => function ($value, $context) {

    dd($context['newRecord']);      //この行を追加

    $pattern = '/^0\d{1,3}-\d{3,4}-\d{3,4}$/';
                    
    return (bool)preg_match($pattern, $value);
  },
  'message' => '正しい電話番号形式ではありません。'
]);


//結果
true

data

フォームに入力した全ての値を確認できます、コードを下記にすると確認できます。

->add('tel', 'custom', [
  'rule' => function ($value, $context) {

    dd($context['data']);      //この行を追加

    $pattern = '/^0\d{1,3}-\d{3,4}-\d{3,4}$/';
                    
    return (bool)preg_match($pattern, $value);
  },
  'message' => '正しい電話番号形式ではありません。'
]);


//結果
[
  'name' => 'デモ会社',
  'kana' => 'でもかいしゃ',
  'tel' => '06-1234-5678',
  'manager' => 'jonioのマネージャー',
  'mail' => 'a@demo.com',
  'created_at' => '2024-05-10T20:04',
  'updated_at' => '2024-05-01T20:04:03',
]

field

今回バリデーションをしようとしたカラムの内容の確認できます、今回はtelカラムです。

コードを下記にすると確認できます。

->add('tel', 'custom', [
  'rule' => function ($value, $context) {

    dd($context['data']);      //この行を追加

    $pattern = '/^0\d{1,3}-\d{3,4}-\d{3,4}$/';
                    
    return (bool)preg_match($pattern, $value);
  },
  'message' => '正しい電話番号形式ではありません。'
]);


//結果
tel

providers

調べたのですが今回のバリデーションルールを他の場面でも使いたい場合に使用するみたいです。

「newRecord」・「data」・「field」に関してはフォームに入力した値をテーブルに登録できない時の確認用に使える印象です。

これで完成です。