やかんブログ

[symfony][propel]DBに登録があるかどうかをチェックするValidator

2008年03月28日(金)17:00|谷口

谷口です。

表題の機能ですが、O/R MapperにPropelを選択している場合、sfPropelUniqueValidatorというクラスが組み込まれております。 使い方はvalidate.ymlで以下のように記述します。(引用元:symfony book 日本語ドキュメント フォームの値を確認する方法

 
loginValidator: 
  class:          sfPropelUniqueValidator 
  param: 
    class:        User 
    column:       login 
    unique_error: This login already exists. Please choose 
another one. 
上記例では、バリデーターはデータベース内で loginカラムが確認するパラメーターとして同じ値を持っている User クラスのレコードを探します。このバリデーターは Propel に依存することを注意してください。

この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." 

もしこれをご覧になって使いたいと思った方は、ご自由にどうぞ。

この記事に関するお問い合わせはこちら

ページの先頭へ