#CakePHP3のバリデーションをまとめてみた
モデル周りも触り出すようになって何となくバリデーション周りも書き方が分かってきたのでまとめてみます。
##バリデーションの掛け方
###普通の保存(ほぼbake)
//Controller
$hoge = $this->Hoges->newEntity();
if ($this->request->is('post')) {
$hoge= $this->Hoges->patchEntity($hoge, $this->request->data);
if ($this->Hoges->save($hoge)) {
//OK
} else {
//NG
}
}
$this->set(compact('hoge'));
###バリデーションのみかける
//Controller
$hoge = $this->Hoges->newEntity($this->request->data);
if ($hoge->errors()) {
//NG
} else {
//OK
}
$this->set(compact('hoge'));
##バリデーションの書き方
###CakePHP標準搭載メソッドの使用
//Table
public function validationDefault(Validator $validator)
{
$validator
//notEmptyの記述。第二引数はメッセージ
->notEmpty('mail', 'required mail')
//メール形式のチェック
->add('mail', 'validFormat', [
'rule' => 'email',
'message' => 'E-mail must be valid'
])
;
return $validator;
}
###独自のバリデーション①(従来のやりかたに近い)
//Table
public function validationDefault(Validator $validator)
{
$validator
//notEmptyの記述。第二引数はメッセージ
->notEmpty('tel', 'required tel')
//customって文字列は意味ありそうでない。
//むしろtelに複数の独自メソッドをかける際には別名にする必要あり
->add('tel', 'custom', [
//第一引数に$thisを指定することでTableのメソッドが指定可能。
//ただし、色々やってみた感じだと引数が何も渡せない?
'rule' => [$this, 'tel'],
'message' => 'invalid tel'
])
;
return $validator;
}
public function tel($value, $context)
{
//boolで返さないとエラー
return (bool) preg_match('/^[0-9]{2,5}-?[0-9]{2,5}-?[0-9]{2,5}$/', $value);
}
###独自のバリデーション②
public function validationDefault(Validator $validator)
{
$validator
//独自のバリデーションルールの記載方法①
->add('tel', 'custom', [
'rule' => function ($value, $context) {
//同一Table内などのメソッドも指定可能
return (bool) preg_match('/^[0-9]{2,5}-?[0-9]{2,5}-?[0-9]{2,5}$/', $value);
},
'message' => 'invalid tel'
])
;
return $validator;
}
###独自のバリデーション③(本命)
<?php
//App/Validation/CustomValidation.php
namespace App\Validation;
use Cake\Validation\Validation;
class CustomValidation extends Validation
{
//メソッドはstaticである必要あり
public static function zip1($value, $context){
//きちんとboolで返さないとエラーになる
return (bool) preg_match('/^[0-9]{3}$/', $value);
}
}
//Table
public function validationDefault(Validator $validator)
{
//使用したい独自バリデーションを設定
$validator->provider('custom', 'App\Validation\CustomValidation');
$validator
->notEmpty('zip1', 'required zip1')
->add('zip1', 'custom', [
'rule' => 'zip1',
'provider' => 'custom',
'message' => 'invalid zip1'
])
;
return $validator;
}
##まとめ
バリデーションの書き方がだいぶ変わっているので慣れが必要な感じです・・・。
独自バリデーションについては③の方法が一番まとまって良さそうです。
これだとModelとFormの間でも簡単に共通のバリデーションルールが使える点も大きそう。
後、公式ではValidation.phpはAPP/Model/Validationとかにおいてますが、私はFormでも使いたいのでAPP直下にValidationをおいてます。
まぁ場所はお好みで・・・。