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

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;
	}
}

以上です。