カスタマイズ、国際化、およびその他の「グッズ」を使用したデータ検証用のライブラリに注目します。 よく知られた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
エラーのリストは、連想配列の形式で表示されます。
- getErrors()-エラースタック全体の出力。
- getFirstError()-最初のエラーを返します。
- getLastError()-最後のエラーを返します。
ルール
ルールのセットは非常に広く、小さな変更でキャンプから「競争相手」を送り出したからです。
ルールのグループがあります:
- 汎用
- ひも
- 数値
- 日時
- ファイルシステム
- ネットワーク
- その他
ルールの完全なリスト
追加の気まぐれは、カスタマイズまたはプル要求によって実現されます。
属性検証
属性によって配列/オブジェクトを検証するには、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 /で入手できます。