Rock Validateの紹介

データ検証は、安全なWebアプリケーションの開発における多くのプラクティスの1つです。 非常に「若い」開発者でさえ、htmlフォームを初めて知ったときに、美しいエラーメッセージを表示しようとします。 いくつかの洗練されたフレームワークのモデルについて私たちは何を言えるでしょう。 したがって...



カスタマイズ、国際化、およびその他の「グッズ」を使用したデータ検証用のライブラリに注目します。 よく知られたRespect / Validationツールを使用し、途中でたくさんの松葉杖を動かしました。ある時点で私はこう言いました。



タスクが設定されました:





すべてがとてつもなくシンプル



$v = Validate::length(10, 20, true)->regex('/^[az]+$/i'); $v->validate('O'Reilly'); // output: false $v->getErrors(); /* output: [ 'length' => 'value must have a length between 10 and 20', 'regex' => 'value contains invalid characters' ] */ $v->getFirstError(); // output: value must have a length between 10 and 20
      
      





エラーのリストは、連想配列の形式で表示されます。



ルール



ルールのセットは非常に広く、小さな変更でキャンプから「競争相手」を送り出したからです。



ルールのグループがあります:



ルールの完全なリスト



追加の気まぐれは、カスタマイズまたはプル要求によって実現されます。



属性検証



属性によって配列/オブジェクトを検証するには、attributes()メソッドが使用されます。

 $input = [ 'username' => 'O'Reilly', 'email' => 'o-reilly@site' ]; $attributes = [ 'username' => Validate::required() ->length(2, 20, true) ->regex('/^[az]+$/i'), 'email' => Validate::required()->email() ]; $v = Valiadte::attributes($attributes); $v->validate($input); // output: false $v->getErrors(); /* output: [ 'username' => [ 'regex' => 'value contains invalid characters', ], 'email' => [ 'email' => 'email must be valid', ], ] */
      
      





属性ごとに1組のルールを使用する:



 Validate::attributes(Validate::required()->string())->validate($input);
      
      





規則の否定



notOf()メソッドを使用してルールの動作を反転します。 この場合、「ネガティブ」ロケール:: MODE_NEGATIVEメッセージテンプレートが使用されます。



 $v = Validate::notOf(Validate::required()); $v->validate(''); // output: true
      
      





このメソッドは、内部属性のルール['email' => Validate :: notOf(Validate :: email())]と、すべての属性全体の両方に適用できます。 例:



 $input = [ 'email' => 'tom@site', 'username' => '' ]; $attributes = Validate::attributes([ 'email' => Validate::email(), 'username' => Validate::required() ]); $v = Validate::notOf($attributes); $v->validate($input); // output: true
      
      





OneOf()ルール



少なくとも1つのルールが正しくない場合、チェックは停止します。 例:

 $input = 7; $v = Validate::oneOf(Validate::string()->email()); $v->validate($input); // output: false $v->getErrors(); /* output: [ 'string' => 'value must be string' ] */
      
      





属性検証の場合、シナリオは否定に似ています。

 $input = [ 'email' => 'tom@site', 'username' => '' ]; $attributes = Validate::attributes([ 'email' => Validate::email(), 'username' => Validate::required() ]); $v = Validate::oneOf($attributes); $v->validate($input); // output: false $v->getErrors(); /* output: [ 'email' => [ 'email' => 'email must be valid', ] ] */
      
      





いつ()ルール



条件を実装する必要があります(3次条件付き操作)。 メソッドの一般的な構文は次のとおりです。



 v::when(v $if, v $then, v $else = null)
      
      





例:

 $v = Validate::when(Validate::equals('Tom'), Validate::numeric()); $v->validate('Tom'); // output false $v->getErrors(); /* output: [ 'numeric' => 'value must be numeric', ] */
      
      





プレースホルダー、メッセージ、およびテンプレートの置き換え



多くのエラーメッセージにはプレースホルダー({{name}}など)が含まれており、デフォルト値に置き換えられます。 自分で置き換えるのは難しくありません:

 $v = Validate::length(10, 20) ->regex('/^[az]+$/i') ->placeholders(['name' => 'username']); $v->validate('O'Reilly'); // output: false $v->getErrors(); /* output: [ 'length' => 'username must have a length between 10 and 20', 'regex' => 'username contains invalid characters', ] */
      
      





同様に、メッセージ全体がこのような「ホット」置換の対象となります。



 $v = Validate::length(10, 20) ->regex('/^[az]+$/i') ->messages(['regex' => ',   !']); $v->validate('O'Reilly'); // output: false $v->getErrors(); /* output: [ 'length' => 'username must have a length between 10 and 20', 'regex' => ',   !' ] */
      
      





ルールメソッドで指定された引数に応じて、メッセージテンプレートが自動的に選択されますが、現在のロケールで説明されている他のメッセージを置き換えることはありません。 例:



 $v = Validate::length(10, 20)->templates(['length' => Length::GREATER]); $v->validate('O'Reilly'); // output: false $v->getErrors(); /* output: [ 'length' => 'value must have a length lower than 20', ] */
      
      





国際化



現在、ロシア語と英語の2つのメッセージ辞書があります。 デフォルトでは、エラーメッセージは英語で表示されます。 locale()メソッドでロケールを設定できます:



 $v = Validate::locale('ru') ->length(10, 20) ->regex('/^[az]+$/i'); $v->validate('O'Reilly'); // output: false $v->getErrors(); /* output: [ 'length' => '       10  20', 'regex' => '   ', ] */
      
      





カスタマイズ



2つのステップで独自のルールを作成できます。



ステップ#1。 ルールを使用してクラスを作成します。



 use rock\validate\rules\Rule class CSRF extends Rule { public function __construct($compareTo, $compareIdentical = false, $config = []) { $this->parentConstruct($config); $this->params['compareTo'] = $compareTo; $this->params['compareIdentical'] = $compareIdentical; } public function validate($input) { if ($this->params['compareIdentical']) { return $input === $this->params['compareTo']; } return $input == $this->params['compareTo']; } }
      
      





ステップ#2。 メッセージを含むクラスを作成します。



 use rock\validate\locale\Locale; class CSRF extends Locale { const REQUIRED = 1; public function defaultTemplates() { return [ self::MODE_DEFAULT => [ self::STANDARD => '{{name}} must be valid', self::REQUIRED => '{{name}} must not be empty' ], self::MODE_NEGATIVE => [ self::STANDARD => '{{name}} must be invalid', self::REQUIRED => '{{name}} must be empty' ] ]; } public function defaultPlaceholders($compareTo) { if (empty($compareTo)) { $this->defaultTemplate = self::REQUIRED; } return [ 'name' => 'CSRF-token' ]; } }
      
      





前述のように、notOf()ルールを使用すると、メッセージテンプレートLocale :: MODE_NEGATIVEが置き換えられます。 サブパターンを使用すると、ルールメソッドで指定された引数に応じてメッセージを多様化できます。 デフォルトでは、Locale :: STANDARD。



利益:



 $config = [ 'rules' => [ 'csrf' => [ 'class' => \namespace\to\CSRF::className(), 'locales' => [ 'en' => \namespace\to\en\CSRF::className(), ] ], ] ]; $sessionToken = 'foo'; $requestToken = 'bar'; $v = new Validate($config); $v->csrf($sessionToken)->validate($requestToken); // output: false $v->getErrors(); /* output: [ 'csrf' => 'CSRF-token must be valid', ] */
      
      





したがって、 既存のルールの置換を実装することが可能です。



追加機能



「空の」値をスキップする必要があるシナリオがあります。 たとえば、オプションのフォームフィールドの場合。 これらの目的のために、skipEmptyプロパティがあります-各ルールに対して「空の」値に反応が設定されます。 一部のルールでは、このプロパティはfalse(スキップしない)に設定されます。つまり、Required、Arr、Bool、String、Int、Float、Numeric、Object、NullValue、Closure、すべてのctypeルールです。 例:



 $v = Validate::email(); $v->validate(''); // output: true
      
      





この動作は元に戻すことができます。



 $v->skipEmpty(false)->validate(''); // output: false
      
      





デフォルトでは、null値は$ value === null ||です。 $値=== [] || $値=== ''。 ルールごとに、独自のisEmptyハンドラーを設定できます。



 $config = [ 'rules' => [ 'custom' => [ 'class' => \namespace\to\CustomRule::className(), 'locales' => [ 'en' => \namespace\to\en\Custom::className(), ], 'isEmpty' => function($input){ return $input === ''; } ], ] ]; $v = new Validate($config);
      
      





設置



 composer require romeoz/rock-validate:*
      
      





一見?





Dockerを使用して起動できる小さなデモがあります。



 docker run --name demo -d -p 8080:80 romeoz/docker-rock-validate
      
      





デモは、 http:// localhost:8080 /で入手できます。



All Articles