忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/06/24 14:16 |
AuraPHP 1.0.0-beta1 Aura.Filter
Aura.Filterは、名前のとおりフィルタリングを行います。
とりあえず最大の問題点を挙げておくと、使用するフィルタを手動で登録しないといけません。
デフォルトで用意されているフィルタについてもです。
Zend_Filterのようなオートロード機構もありません。
デフォルトのコンストラクタはこんなことになっています。
$ruleCollection = new \Aura\Filter\RuleCollection(
	new \Aura\Filter\RuleLocator([
		'alnum'                 => function() { return new Rule\Alnum; },
		'alpha'                 => function() { return new Rule\Alpha; },
		'between'               => function() { return new Rule\Between; },
		'blank'                 => function() { return new Rule\Blank; },
		'bool'                  => function() { return new Rule\Bool; },
		'creditCard'            => function() { return new Rule\CreditCard; },
		'dateTime'              => function() { return new Rule\DateTime; },
		'email'                 => function() { return new Rule\Email; },
		'equalToField'          => function() { return new Rule\EqualToField; },
		'equalToValue'          => function() { return new Rule\EqualToValue; },
		'float'                 => function() { return new Rule\Float; },
		'inKeys'                => function() { return new Rule\InKeys; },
		'int'                   => function() { return new Rule\Int; },
		'inValues'              => function() { return new Rule\InValues; },
		'ipv4'                  => function() { return new Rule\Ipv4; },
		'max'                   => function() { return new Rule\Max; },
		'min'                   => function() { return new Rule\Min; },
		'regex'                 => function() { return new Rule\Regex; },
		'strictEqualToField'    => function() { return new Rule\StrictEqualToField; },
		'strictEqualToValue'    => function() { return new Rule\StrictEqualToValue; },
		'string'                => function() { return new Rule\String; },
		'strlenBetween'         => function() { return new Rule\StrlenBetween; },
		'strlenMax'             => function() { return new Rule\StrlenMax; },
		'strlenMin'             => function() { return new Rule\StrlenMin; },
		'strlen'                => function() { return new Rule\Strlen; },
		'trim'                  => function() { return new Rule\Trim; },
		'upload'                => function() { return new Rule\Upload; },
		'url'                   => function() { return new Rule\Url; },
		'word'                  => function() { return new Rule\Word; },
	])
);
なんとも残念な感じです。
Composerのオートロードは諦め、instance.phpをインクルードするのがよいでしょう。

名前はフィルタですが、実際はバリデーションとフィルタを同時に行います。
<?php
	// Aura.Filter
	$filter = require_once('path/to/channel/vendor/aura/filter/scripts/instance.php');
	
	// 失敗したら全フィルタリングを即打ち切り
	$filter->addStopRule('a', $filter::IS, 'alnum');
	$filter->addStopRule('a', $filter::FIX, 'int');
	
	// 失敗したら該当の値は打ち切り、他は続ける
	$filter->addHardRule('b', $filter::IS, 'email');
	$filter->addHardRule('b', $filter::FIX, 'alpha');
	
	// 失敗しても続ける
	$filter->addSoftRule('c', $filter::IS, 'bool');
	$filter->addSoftRule('c', $filter::FIX, 'blank');
	
	// フィルタ実行
	$data = array( 'a'=>'a1', 'b'=>'hoge@example.jp', 'c'=>'c3' );
	$success = $filter->values($data); // false
	
	// $dataは直接書き換えられる
	// array( 'a'=>1, 'b'=>'hogeexamplejp', 'c'=>NULL )
	
	// 失敗時に原因を取得
	$filter->getMessages();

Aura\Filter\RuleCollectionにバリデーションとフィルタのルールを与え、最後に値をvalues()で渡すという形でフィルタリングを行います。
values()は参照渡しになっているので、与えたデータが直接変更されます。
返り値はバリデーションとフィルタが成功したらtrue、ひとつでも問題があればfalseとなります。
失敗時の原因は別途getMessages()で取得します。

ルールの与えかたは3種類あります。
addSoftRule()は、該当のルールでバリデーションが失敗しても、失敗を記録するだけで次のルールに進みます。
基本的にこれを使うことが多いでしょう。
addHardRule()は、失敗したら同じ値に対してその後のルール適用は行いません。
例の場合、'email'判定に失敗したら、'alpha'への変換を実行しない、となります。
それ以外の値、上記では'a'や'c'については影響を及ぼしません。
addStopRule()は、失敗した時点で全てのフィルタリングを即座に中止します。

これらは第二引数に与える値によって挙動が変化します。
まずバリデーションとして、RuleCollection\ISであれば===、IS_NOTは!==、IS_BLANK_ORは===もしくはNULLです。
次にフィルタとして、FIXであれば正規表現による置換、FIX_BLANK_ORであれば置換、ただし''などはNULLにする、となります。
基本的にはRuleCollection\IS等でバリデーションだけを行い、電話番号欄に数値以外があったらRuleCollection\FIXで数値を削除といったふうに追加でフィルタリングを行うという運用になるでしょう。
ルールはコンストラクタを見るとわかるとおり、最初から30種類ほど用意されているので、大抵はそれらを使うだけで事足りるはずです。

なお、Aura.Filterはあくまで入力値に対するフィルタリングを行うだけなので、値をHTMLやSQLに渡す際のエスケープはもちろん別途行わなければなりません。
入力値フィルタでhtmlspecialchars()やmysqli_real_escape_string()を行うのは大間違いなので行わないようにしましょう。
もちろんその手のフィルタは最初から存在しません。


AuraPHPの記事

PR


2013/06/14 23:35 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2013/06/16 | HOME | AuraPHP 1.0.0 Aura.Autoload>>
忍者ブログ[PR]