[Symfony1.4][Validator] カスタムバリデータを作成する方法
Symfony1.4で、カスタムバリデータを作成する方法を調べて、実践したのでメモ。
まず、カスタムバリデータを作る前に、自分が使いたいバリデータが既存のものにないか確認します。
・symfony Forms in Action | 付録 B – バリデータ | symfony | Web PHP Framework
使いたいバリデータがない場合は、自分で作ります。
カスタムバリデータを作るときに参考になった記事は、Symfony1.4だと以下の通りです。
・The More with symfony book | カスタムウィジェットとバリデータ | symfony | Web PHP Framework
・symfonyでカスタムバリデータを使ってフィルタを実装する – spanstyle::monolog
・symfonyのValidatorで全角/半角変換などを行う – ゆっくり*ゆっくり
実際に、書籍を特定するための番号であるISBNを入力値の長さと文字の構成を確認するバリデータを作ってみました。
ちなみに、ISBNは、ISBN-10だと10桁で、1桁目が 0 ~ 9 、X が使用され、他の桁は数字です。ISBN-13は13桁で、数字のみで構成されています。
・参考:ISBN – Wikipedia
正規表現の使い方はこちらを参考にしました。
・正規表現
そして、実際に作ったのが下記のソースになります。
■ myValidatorIsbn.class.php
(ISBNの形式に合ってるか確認するバリデータ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php class validatorIsbn extends sfValidatorBase { protected function doClean($value) { // 入力値の長さが10文字の場合、そのまま入力値を返す // ISBN-10は、1桁目が 0 ~ 9 、X で構成され、他の桁は数字 if (strlen($value) == 10){ if (preg_match("/^[0-9]{9}?[0-9X]$/" ,$value)){ return $value; } else { throw new sfValidatorError($this, 'ISBN-10は1桁目は 0~9 、X、他の桁は数字で入力して下さい', array('value' => $value)); } } // 入力値の長さが13文字の場合、そのまま入力値を返す if (strlen($value) == 13){ // ISBN-13は数字のみで構成される if (preg_match("/^[0-9]{13}?$/" ,$value)) { return $value; } else { throw new sfValidatorError($this, 'ISBN-13は数字のみで入力して下さい', array('value' => $value)); } } // それ以外の場合、エラー throw new sfValidatorError($this, 'ISBNは10文字、または13文字で入力して下さい', array('value' => $value)); } } |
■ IsbnSearchForm.class.php
(ISBNの入力フォームを定義しているフォームファイル)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php class IsbnSearchForm extends BaseForm { public function configure() { $this->setWidgets(array( 'isbn' => new sfWidgetFormInput(array(), array('size' => 20, 'maxlength' => 13, )), )); $this->setValidators(array( 'isbn' => new myValidatorIsbn(array('required' => true, ), array('required' => '未入力', )), )); $this->widgetSchema->setNameFormat('isbn_search[%s]'); $this->widgetSchema->setLabels(array('isbn' => 'ISBN10/13', )); } } |
以上です。