[symfony][propel]DBに登録があるかどうかをチェックするValidator
2008年03月28日(金)17:00|谷口
谷口です。
表題の機能ですが、O/R MapperにPropelを選択している場合、sfPropelUniqueValidatorというクラスが組み込まれております。 使い方はvalidate.ymlで以下のように記述します。(引用元:symfony book 日本語ドキュメント フォームの値を確認する方法)
上記例では、バリデーターはデータベース内で loginカラムが確認するパラメーターとして同じ値を持っている User クラスのレコードを探します。このバリデーターは Propel に依存することを注意してください。loginValidator: class: sfPropelUniqueValidator param: class: User column: login unique_error: This login already exists. Please choose another one.
このsfPropelUniqueValidatorでは登録済みの場合Errorを返すわけですが、逆もあって欲しいケースがあります。そんな場合の拡張をしてみましたので、参考にしていただけると幸いです。 使い方は下記のmyDbRegisteredValidatorを適当なlibに配置し、validate.ymlで設定するだけです。
class myDbRegisteredValidator extends sfValidator
{
public function initialize($context, $parameters = null)
{
parent::initialize($context);
$this->getParameterHolder()->add($parameters);
return true;
}
public function execute(&$value, &$error)
{
$params = $this->getParameterHolder()->getAll();
$class = $params['class'];
$column = $params['column'];
$c = new Criteria;
eval('$model_column = ' . $class . 'Peer::' . strtoupper($colu
mn) . ';');
$c->add($model_column, $value);
eval('$result = ' . $class . 'Peer::doSelectOne($c);');
if ($this->_is_error($result, $params['error_condition'])) {
$error = $params['error_message'];
return false;
}
return true;
}
private function _is_error(&$result, $condition)
{
switch ($condition) {
case 'exist':
return !empty($result);
case 'not_exist':
return empty($result);
default:
return false;
}
}
}
validate.ymlに書く内容は以下のとおりです。
class: myDbRegisteredValidator
param:
class: TableName
column: ColumnName
error_condition: not_exist
error_message: "Invalid ColumnName Value."
もしこれをご覧になって使いたいと思った方は、ご自由にどうぞ。