Webtech Walker

sfFormの汚染された値とクリーンな値について

sfFormのバリデータはフィルタを兼ねていて、バリデータを通るまえの汚染された値($taintedValues)とバリデータを通った後のクリーンな値($values)の二つを保持してます。この二つの違いがわかってないと結構はまります。少なくとも僕ははまりました。

getValues()やgetValue($filed)などのメソッドで返ってくるのはバリデータを通った後のクリーンな値なので、getValues()で値がうまく取れない!というときはバリデータのフィルタがうまくいっていなことが多いです。ありがちなのは、widgetは設定してるのにvalidatorをセットしてない場合とcallbackで値を返してない場合。

widgetは設定してるのにvalidatorをセットしてない場合

widgetをセットしたフィールドは何かしらバリデータを設定しないと値がとれなくなるので、バリデートしないフィールドにはsfValidatorPass()を設定する。

$this->setValidators(array(
    'name' => new sfValidatorPass(), 
));

バリデータしなくていいフィールドにわざわざ何か設定しないといけないのは不毛な気もするけどそれがsfFormの仕様です。

callbackで値を返してない場合

callbackも同じようにフィルタを兼ねるので、何かしら値を返さないと$valuesに値が入りません。

function constant_validator_callback($validator, $value, $arguments)
{
    if ($value != $arguments['constant'])
    {
      throw new sfValidatorError($validator, 'invalid');
    }

    return $value; //←これを忘れない
}

ここで$valueの値をごにょごにょして返すことも可能。

僕の場合は$valueを返すのを忘れたていたというか、$valueを返さないといけないというのをわかっていなくて、これがわかったときにsfFormがちょっとだけ理解できた気がしました。

このエントリーをはてなブックマークに追加