sfValidatorSchemaのオプションを変更する

フォーム定義クラス(sfForm派生クラス)内でバリデーションの設定を行う場合、SymfornyのFormsドキュメントでは以下のようなサンプルコードになっています。

http://symfony.xrea.jp/1.1/forms_book/02-Form-Validation.html 「バリデータ」

<?php
$this->setValidators(array(
  'name'    => new sfValidatorString(array('required' => false)),
  'email'   => new sfValidatorEmail(),
  'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),
  'message' => new sfValidatorString(array('min_length' => 4)),
));
?>

通常フォームのすべての要素にバリデータを設定することがほとんどだと思われますが、定義したフォーム要素のすべてに対して対応するバリデータが設定されていない場合、「Unexpected extra form field named~」というエラーメッセージが表示されてしまいます。

この挙動は、sfValidatorSchemaのオプション「allow_extra_fields」の値がfalseの場合、つまり「余分なフィールドを許可しない」という設定の場合のものです。

allow_extra_fieldsをtrueに設定すれば、バリデータが定義されていない要素があってもこのようなエラーにはなりません。


しかし、setValidators等のメソッドを使用している場合、sfFormクラスのメソッド内部で暗黙的に(オプションなしで)sfValidatorSchemaオブジェクトが作成されるため、コンストラクタへオプションを引き渡すことが出来ません。

このような場合は、自前でsfValidatorSchemaオブジェクトを作成し、sfForm::setValidatorSchemaメソッドを使用して用意したsfValidatorSchemaオブジェクトを直接セットします。

★allow_extra_fieldsをtrueにして、バリデータを持たないフォーム要素を許可することは、セキュリティの観点から推奨されていません。trueにする場合は、予期しないパラメータに対するチェックを慎重に行ってください。

<?php
$this->setValidatorSchema(
  new sfValidatorSchema( array(
    'name'    => new sfValidatorString(array('required' => false)),
    'email'   => new sfValidatorEmail(),
    'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),
    ),
    array( 'allow_extra_fields'=>true )
  )
);
?>


追記:sfValidatorSchema::setOptionメソッドを使用すれば、コンストラクタのパラメータでなくてもオプションを設定できるということを忘れていました(勉強不足でしたw
(以下のコードは http://symfony.xrea.jp/1.1/forms_book/02-Form-Validation.html のリスト2-9です)

<?php
    $this->setValidators(array(
      'email'   => new sfValidatorEmail(),
      'subject' => new sfValidatorChoice(array('choices' => array_keys(self::$subjects))),
      'message' => new sfValidatorString(array('min_length' => 4)),
    ));
 
    $this->validatorSchema->setOption('allow_extra_fields', true);
?>