【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;
}
// ... 後略
}
複数のカラムで共有したいルールがあったり、既存の検証ルールを拡張したい場合は使えそうですね。