BLOG

CodeIgniterで独自バリデーション

CodeIgniterの独自バリデーションについて、
公式マニュアルでは、コントローラーに独自のバリデーションメソッドを定義していく形が紹介されていますが、
今回はちょっと違う手法を試してみました。
具体的には、librariesフォルダにバリデーションメソッドをまとめたライブラリを作成し、それを呼び出す形です。
それでは、以下でざっくりと説明していきます。
 
 
1.バリデーションメソッドをまとめたライブラリを作成する
 
まずはlibrariesフォルダにライブラリを作成します。
ファイル名は何でもいいですが、とりあえず「Validation.php」としておきます。
 
libraries/Validation.php

class Validation{
	private $_errorMessage = ''; // バリデーションエラー時のメッセージ用
	
	/**
	 * エラーメッセージのゲッター
	 */
	public function getErrorMessage(){
		return $this->_errorMessage;
	}
	
	/**
	 * 郵便番号のバリデーション
	 */
	public function zipcode($value){
		if(!preg_match('/^\d{3}\-\d{4}$/', $str)){
			$this->_errorMessage = '郵便番号おかしいよ!';
			return false;
		}
		
		return true;
	}
	
	/**
	 * 電話番号のバリデーション
	 */
	public function tel($value){
		if(!preg_match('/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/', $str)){
			$this->_errorMessage = '電話番号おかしいよ!';
			return false;
		}
		
		return true;
	}

 
あわせて、config/autoload.phpに上記ライブラリの読み込みを追加しておきます。
 
config/autoload.php

$autoload['libraries'] = array(
	'validation' // validationライブラリを読み込む
);

 
 
2.バリデーションの設定
 
公式マニュアル通り、configのform_validation.phpで設定します。
※ファイルが無い場合は作成してください。作成後はautoload.phpに追記するのを忘れずに。
 
config/form_validation.php

'hoge' => array(
	array(
		'field' => 'zip_code',
		'label' => '郵便番号',
		'rules' => 'callback_customValidation[zipcode]'
	),
	array(
		'field' => 'tel',
		'label' => '電話番号',
		'rules' => 'callback_customValidation[tel]'
	)
)

 
公式マニュアルにもありますが、rulesに「callback_」の接頭辞を付けたメソッドを設定し、
コントローラーにそのメソッドを定義しておけば、バリデーション時に呼び出されるようになります。
上記の場合だと、コントローラーの「customValidation()」が呼び出されます。
ここでは、先ほど作成したライブラリのバリデーションメソッド名を、引数として渡しておきます。
 
 
3.ライブラリのメソッドの呼び出し
 
form_validation.phpで設定した「customValidation()」を、コアコントローラーで定義します。
引数でライブラリのメソッド名を受け取り、それを呼び出すようにしています。
 
core/MY_Controller.php

/**
 * 引数 $value:フォームの入力値, $func:ライブラリのメソッド名
 */
function customValidation($value, $func){
	// Validation.phpのメソッド呼び出し
	$result = $this->validation->{$func}($value);
	
	// Validation.phpのメッセージゲッター実行
	$this->form_validation->set_message('customValid', $this->validation->getErrorMessage());
	
	return $result;
}

 
 
以上、かなりざっくりではありますが、ライブラリでのバリデーション定義の説明でした。
自分は元々CakePHPユーザーなので、モデルでバリデーションを管理する形にしたいところですが、
とりあえず現時点ではここまでとします。

Tweet about this on TwitterShare on FacebookShare on Google+