【CakePHP 3】再利用可能なバリデーションルールを実装する

【CakePHP 3】再利用可能なバリデーションルールを実装する

CakePHP 3 にてすでに用意されているバリデーションルール以外を使いたい場合、いくつかの方法があります。 今回は、「カスタムプロバイダーからのルールを利用する」方法をご紹介します。

ルールを定義する

src/Model/Validation/CustomValidation.phpにルールを追加します。

<?php
namespace App\Model\Validation;

use Cake\Validation\Validation;

/**
 * カスタムバリデーションクラス
 */
class CustomValidation extends Validation
{
    /**
     * メールアドレスのバリデーション
     * 日本の携帯キャリア(docomo, au)のドメインに限り、連続ドットや@直前のドットを許可する
     * @param string $check
     * @param bool $deep
     * @return bool
     */
    public static function emailLoose($check, $deep = false)
    {
        $allowLooseAddressDomain = '/@(docomo|ezweb)\.ne\.jp\z/ui';
        $regex = null;
        if (preg_match($allowLooseAddressDomain, $check)) {
            $regex = '/\A[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+(?:[\.\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . self::$_pattern['hostname'] . '\z/ui';
        }
        return parent::email($check, $deep, $regex);
    }
}

上記に定義した emailLoose メソッドでは特定の携帯キャリアのメールアドレスの場合にのみ連続ドットや @ 直前のドットを許容する、というルールです。 email ルールで使われている正規表現をカスタムしており、特定の携帯キャリアでない場合はemailルールを使うようにします。

定義したルールを利用する

定義したルールはテーブルクラスのvalidationDefault やModelless Fromで以下のように利用できます。 最初に setProvider を呼び出し、ルール追加時に 'provider' => 'custom' を追加する必要があります。

テーブルクラス

<?php
    public function validationDefault(Validator $validator)
    {
        $validator->setProvider('custom', 'App\Model\Validation\CustomValidation');
        $validator
            ->add('email_mobile', 'emailLoose', [
                'rule' => 'emailLoose',
                'provider' => 'custom',
                'message' => 'メールアドレスの形式をお確かめください',
            ])

        // ...その他のルールをここで追加する
        return $validator;
    }

Modelless Form の場合

<?php
class ContactForm extends Form
{
    // ... 前略

    protected function _buildValidator(Validator $validator)
    {
        $validator->setProvider('custom', 'App\Model\Validation\CustomValidation');
        $validator
            ->add('email_mobile', 'emailLoose', [
                'rule' => 'emailLoose',
                'provider' => 'custom',
                'message' => 'メールアドレスの形式をお確かめください',
            ])

        // ...その他のルールをここで追加する
        return $validator;
    }
    // ... 後略
}

複数のカラムで共有したいルールがあったり、既存の検証ルールを拡張したい場合は使えそうですね。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ