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 /で入手できます。

Source: https://habr.com/ru/post/J253621/


All Articles