2009年03月26日
CakePHP + unbindValidation
unbindValidationを使用するとModelのバリデーションを動的にコントロールできます。
これまでバリデーション対象から除外したいフィールドがあった場合どうやっていたかというと、
除外したいModelインスタンスのバリデーションルールを安直にunsetしてました。
これはつらい!
というわけで、今日からはunbindValidationを使用してインテリジェンスな開発をします。
情報元:
Simple Way to Unbind Validation & Set Remaining Rules to Required
使用方法です。
1.以下のメソッドをapp_model.phpに追加します。
function unbindValidation($type, $fields, $require=false)
{
if ($type === 'remove')
{
$this->validate = array_diff_key($this->validate, array_flip($fields));
}
else
if ($type === 'keep')
{
$this->validate = array_intersect_key($this->validate, array_flip($fields));
}
if ($require === true)
{
foreach ($this->validate as $field=>$rules)
{
if (is_array($rules))
{
$rule = key($rules);
$this->validate[$field][$rule]['required'] = true;
}
else
{
$ruleName = (ctype_alpha($rules)) ? $rules : 'required';
$this->validate[$field] = array($ruleName=>array('rule'=>$rules,'required'=>true));
}
}
}
}
2.各コントローラ内のバリデーション手前で、unbindValidationをコールします。
例)Userモデルのmail、passwordフィールドを検証しない場合
$this->User->unbindValidation('remove',array('mail','password'),true);
例)Userモデルのmail、passwordフィールドのみ検証する場合
$this->User->unbindValidation('keep',array('mail','password'),true);
3.あとは通常通りにバリデーションを実行します。
詳細はSimple Way to Unbind Validation & Set Remaining Rules to Requiredを見てください。

コメントを投稿