[Symfony1.4] PostValidatorで個別のフィールドにバリデーションエラーを設定する方法

Tadashi Shigeoka ·  Tue, November 15, 2011

Symfony1.4にて、PostValidatorで個別のフィールドにバリデーションエラーを設定する方法を調べたのでメモ。

・参考:postValidatorから個別のフィールドにエラーを設定 - ゆっくり*ゆっくり はてなブックマーク - postValidatorから個別のフィールドにエラーを設定 - ゆっくり*ゆっくり

最初は、単純に sfValidatorError を使って、バリデーションエラーメッセージを表示させていたのですが、この書き方だとGlobalErrorになります。

// ログインIDの重複チェックをするバリデータ
class ValidatorSameLoginId extends sfValidatorBase{
  protected function doClean($value){
    // DBから同じログインIDのレコードを取得
    $user = UserTable::getInstance()->getOneByLoginId($value['login_id']);
    // 同じログインIDのレコードが既に存在する場合、バリデーションエラー
    if($user != false){
      throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value));
    }
    return $value;
  }
}

これを単一のフィールドに対するエラーであるNamedErrorにするには、

if($user != false){
  throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value));
}

の部分を、sfValidatorErrorSchema を使って以下のように書き換えると、個別のフィールドにバリデーションエラーを表示させることができます。

symfony API » sfValidatorErrorSchema Class | symfony | Web PHP Framework はてなブックマーク - symfony API » sfValidatorErrorSchema Class | symfony | Web PHP Framework

class ValidatorSameLoginId extends sfValidatorBase{
  protected function doClean($value){
    // DBから同じログインIDのレコードを取得
    $user = UserTable::getInstance()->getOneByLoginId($value['login_id']);
    // 同じログインIDのレコードが既に存在する場合、バリデーションエラー
    if($user != false){
      throw new sfValidatorErrorSchema($this, array(
        'login_id' => new sfValidatorError($this, '同じログインIDが既に登録されています'),
      ));
    }
    return $value;
  }
}

以上です。