バリデートをXMLで行う

※ソースは最下部

ZendFrameworkでのバリデーションは普通Zend_Validateを使います。
といっても、分離されているので単独のパッケージですが。

Zend_Validate

通常では

<?php
// バリデータチェインを作成し、そこにバリデータを追加します
$validatorChain = new Zend_Validate();
$validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
               ->addValidator(new Zend_Validate_Alnum());
?>

のように記述していくのですがさすがに毎回それぞれのエラーメッセージを設定したりとめんどくさいです。
なにより送られてくる一つ一つの項目に上記のようなチェックを書くのは正直めんどいです
そこでXMLでZend_Validateを使えるようにしたので紹介。
といっても最低限動くようにチャチャっと作って、後で細かい部分とかコードは調整しようと思っていたので、汚いですが・・・

具体例のほうが分かりやすいと思うので
例として

  • hoge_id」というキーで値が送られてくる
  • hoge_id」は整数で1000以下
<?xml version="1.0" encoding="UTF-8"?>
<validate>
	<!-- hoge_id -->
	<!--   notmust="true"を指定すると空文字列かnullの場合にはバリデートをスキップ -->
	<hoge_id  notmust="true">
		<!--
		バリデータごとに個別にインバリッドのときのメッセージを指定しないで
		キーごとにまとめて基本のメッセージを指定することもできます
		-->
		<default_invalid_msg></default_invalid_msg>
		<validate>
			<!--
			break="true"だった場合そのキーの値の中のバリデートのリストで
			インバリッドだった場合に次以降のバリデートをスキップします
			※この場合したのZend_Validate_LessThanのチェック項目
			-->
			<rule break="true">
				<!--
				バリデートに使うクラス
				Zend_Validate_Interfaceを実装したクラス
				-->
				<validate_class>Zend_Validate_Digits</validate_class>
				<!-- インバリッドの時のメッセージ -->
				<invalid_msg>整数で入力してください</invalid_msg>
			</rule>
			<rule break="true">
				<validate_class>Zend_Validate_LessThan</validate_class>
				<invalid_msg>1000以下の値を入力してください</invalid_msg>
				<!--
				引数は最大で3つまで有効
				引数は,で区切る
				必要になったら無限個数対応するけど・・・めんどいからやめました
				-->
				<args>1000</args>
			</rule>
		</validate>
	</hoge_id>
</validate>
<?php
Zend::loadClass('Toytools_ValidateByXml');
$validator = new Toytools_ValidateByXml( dirname(__FILE__).DIRECTORY_SEPARATOR.'ValidateTest.xml' );
$validator->valid( $_POST );
//$validator->valid( $this->_getAllParams() );//ZendFrameworkの場合はこんな感じ
if( !$validator->isValidAll() ){
	//全てOK
}else{
	if( !$validator->isValid('hoge_id') ){
		$invalidMsg = $validator->getInvalidMessageList('hoge_id');
		//....とか色々
	}
}
?>

みたいな感じで書けます

  • 送られてきたキーが増える場合にはと同階層にキーをタグ名にしたものを増やしていけばOK
  • デフォルトで用意されているバリデートクラスは十分とはいえないので必要になったらZend_Validate_Interfaceを実装したバリデートクラスを作る
  • 個別のインバリッドメッセージがなかったらデフォルトのインバリッドのメッセージを使うとか

まぁある程度の機能は用意されています
XMLのバリデートははいってません

以下ソース

続きを読む