symfony1.4 sfForm複数条件でバリデーション

今回はPHPで利用できるフレームワークsymfonyのお話。

フォームから送信された値をバリデーション処理するんだけど。
複数の値を比較したい時とかある。そんなときはsfValidatorSchemaCompareを使う。
例えばパスワード入力を2回行い、二つの値が正しいか判定する場合

<?php
$v = new sfValidatorSchemaCompare('password1', '==', 'password2');

この値の比較の前に各々のバリデーションを行って、クリーンアップされた値を渡すとさらに精度の高いバリデーションが行える。

<?php
$this->setPostValidator(new sfValidatorSchemaCompare('password1', '==', 'password2');

さて、値を加工してバリデーション判定をしたい場合はどうしよう?

フォームで開始日と終了日を入力してもらうようなシチュエーションで、送信されたデータをバリデーションする場合。
各々の値は日付であるかバリデーションを行う必要があるのでsfValidatorDateなどで比較を行えばよいが、
開始日より終了日のほうが後であるか確認しなければならないので別途コールバック関数を用意して対応する。

<?php
class HogeForm extends BaseHogeForm
{
  public function configure()
  {
    $this->validatorSchema['start_date'] = new sfValidatorDate();
    $this->validatorSchema['end_date']   = new sfValidatorDate();
    $this->validatorSchema->setPostValidator(
      new sfValidatorCallback(array('callback' => array($this, 'validatorDate')))
    );
  }

  public function validatorDate($validator,$values)
  {
    // 開始日より終了日が早ければバリデーションエラーを投げる
    if (strtotime($values['start_date']) > strtotime($values['end_date'])){
      throw new sfValidatorError($validator, '開始日より後の日付を終了日に入力してください');
    }

    // 正しければクリーンな値を返す
    return $values;
  }
}