CakePHP Behaviorでバリデーション周りの効率化を図る 応用編
前回紹介したBasicValidationBehaviorを使って、動的にバリデーションを切り替える方法を紹介します。
共通のモデルを複数のフォームで利用している場合にバリデーションの定義を動的に変更したい場合などに有効です。
例1:新規登録時と編集時でバリデーションの登録項目を変更する
対応1)loadValidate()メソッドに引数を追加し、条件によって分岐させる
[モデル内の処理]
PHP:
-
function loadValidate($action = 'add') {
-
'name' => 'required | maxLen[50]',
-
'email' => 'required | email | isUnique | maxLen[200]',
-
'password' => 'required | single | maxLen[20] | minLen[6]',
-
're_password' => 'required | confirm[password]',
-
'sex' => 'required | numeric | maxLen[1]',
-
'birthday' => 'required | ymd',
-
'tel' => 'required | phone | maxLen[13]',
-
'zip' => 'required | zip | maxLen[8]',
-
'pref' => 'required | maxLen[12]',
-
'addr1' => 'required | maxLen[200]',
-
'addr2' => 'maxLen[200]',
-
);
-
// 新規登録時以外はパスワード関連の項目を無効にする
-
if($action !== 'add'){
-
}
-
$this->setValidate($valid);
-
}
対応2)コントローラーでモデルのvalidate()やsave()前にloadValidate()を明示的に実行する
[コントローラー内の処理]
PHP:
-
function add(){
-
// 処理を省略
-
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('add');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}
-
-
function edit($id = null){
-
// 処理を省略
-
-
$this->TestUser->id = $id;
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('edit');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}