78
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP3のバリデーションをまとめてみた

Last updated at Posted at 2015-05-07

#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をおいてます。

まぁ場所はお好みで・・・。

78
83
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?