[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
 

正規表現の使い方はこちらを参考にしました。
 

正規表現 | PHP Labo

正規表現
 

そして、実際に作ったのが下記のソースになります。
 

■ 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', ));
	}
}

 

以上です。