CakePHP Behaviorでバリデーション周りの効率化を図る 応用編

前回紹介したBasicValidationBehaviorを使って、動的にバリデーションを切り替える方法を紹介します。
共通のモデルを複数のフォームで利用している場合にバリデーションの定義を動的に変更したい場合などに有効です。

例1:新規登録時と編集時でバリデーションの登録項目を変更する

対応1)loadValidate()メソッドに引数を追加し、条件によって分岐させる

[モデル内の処理]

PHP:
  1. function loadValidate($action = 'add') {
  2.     $valid = array(
  3.         'name'   => 'required | maxLen[50]',
  4.         'email'         => 'required | email | isUnique | maxLen[200]',
  5.         'password'  => 'required | single | maxLen[20] | minLen[6]',
  6.         're_password'   => 'required | confirm[password]',
  7.         'sex'     => 'required | numeric | maxLen[1]',
  8.         'birthday'  => 'required | ymd',
  9.         'tel'      => 'required | phone | maxLen[13]',
  10.         'zip'      => 'required | zip | maxLen[8]',
  11.         'pref'    => 'required | maxLen[12]',
  12.         'addr1'      => 'required | maxLen[200]',
  13.         'addr2'      => 'maxLen[200]',
  14.     );
  15.     // 新規登録時以外はパスワード関連の項目を無効にする
  16.     if($action !== 'add'){
  17.         unset($valid['password']);
  18.         unset($valid['re_password']);
  19.     }
  20.     $this->setValidate($valid);
  21. }

対応2)コントローラーでモデルのvalidate()やsave()前にloadValidate()を明示的に実行する

[コントローラー内の処理]

PHP:
  1. function add(){
  2. // 処理を省略
  3.  
  4.     $this->TestUser->set($this->data);
  5.     // バリデーションを設定
  6.     $this->TestUser->loadValidate('add');
  7.     if($this->TestUser->validates()) {
  8.    
  9. // 処理を省略
  10. }
  11.  
  12. function edit($id = null){
  13. // 処理を省略
  14.  
  15.     $this->TestUser->id = $id;
  16.     $this->TestUser->set($this->data);
  17.     // バリデーションを設定
  18.     $this->TestUser->loadValidate('edit');
  19.     if($this->TestUser->validates()) {
  20.    
  21. // 処理を省略
  22. }

Read more

CakePHP Behaviorでバリデーション周りの効率化を図る

CakePHPでバリデーションを使う際、標準(CakePHP1.2)のままでも十分開発はできますが、大きめのプロジェクトや複数のプロジェクトでも汎用的かつ効率的に使えるようにできないかと検討しました。

バリデーション改善の目的

  1. エラーメッセージを日本語化し共通化・デフォルト化したい
  2. 独自バリデーションメソッドを共通化したい
  3. ルール配列を簡単に記述したい(項目が多いとソースが長くなり過ぎて見通しがよくない)
  4. バリデーションの前に自動で整形処理をしたい(半角英数変換やカタカナ変換など)

実装にあたって

バリデーションメソッドの共通化については、
cakephperさんの日記:よく使う独自バリデーションルールをプラグインのbehaviorにまとめる
に記載してありますように、プラグインのbehaviorで管理するほうが良いと思いますが、今回は弊社で過去に実装した通常のbehavior(BasicValidationBehaviorとします)を使った方法を紹介します。

Read more