複数フィールドのバリデーションについて

From、To共に値が入っていた時のみ処理を流すようにするためには
どのようにしたら良いのでしょうか

http://okyuu.com/ja/question/7806
<?php

class HogeFormFilter extends sfFormFilterDoctrine
{
  public function configure()
  {
    // ...

    $this->validatorSchema['from'] = new sfValidatorInteger(array('required' => false));
    $this->validatorSchema['to'] = new sfValidatorInteger(array('required' => false));

    $this->validatorSchema->setPostValidator(new sfValidatorCallback(
      array(
        'callback' => array($this, 'validateFromTo'),
      ),
      array(
        'invalid' => 'fromとtoを正しく入力してください',
      )
    ));
  }

  public function validateFromTo(sfValidatorBase $validator, $values)
  {
    if (strlen($values['from']) && strlen($values['to']))
    {
      if ($values['from'] > $values['to'])
      {
        throw new sfValidatorError($validator, 'invalid');
      }
    }

    return $values;
  }
}

※$this->setPostValidator()となっていたのを$this->validatorSchema->setPostValidator()に修正しました。id:innx_hidenoriさんご指摘ありがとうございました。

こんな感じでsfValidatorCallback使うのが手っ取り早いと思います。

各フィールドごとに設定するバリデータ(上記でいえばfromとtoのsfValidatorIntegerなど)は単一のフィールドのみのバリデーションになりますので、複数フィールドにまたがるバリデーションは基本的にpostValidatorを利用します。

postValidatorに設定したバリデータには、個別フィールドに対するバリデーションが行われた値の配列が渡されますので、複数フィールドのバリデーションが可能になります。

sfValidatorCallbackはその名の通りコールバックを指定してバリデーションするものですが、postValidatorに指定した場合は第2引数に値が配列で渡されますので、それを好きなように処理します。

sfValidatorCallbackを利用する場合、validな場合は値をreturnし、invalidな場合はsfValidatorErrorをthrowします。これを覚えておけば、大抵のバリデーション処理は記述可能かなと思います。

また、validなときは基本的に値をそのまま返しますが、このときに値を変更・追加して返すことも可能です。たとえば $values['hoge'] = 'fuga'; としてからreturnすると、全体のバリデーションが全て通っていれば $form->getValue('hoge') として値を取り出すことが可能です。

これは例えばログイン用のフォームで、IDとパスワードに一致するユーザがいた場合に、該当ユーザのオブジェクトを$values['user']にセットして返す、といったことが可能です。