データをチェックしておく

ユーザーデータを信頼できないことは秘密ではありません。 したがって、ひとたびデータ検証を思いついたら。 さて、私は、興味と利益のために、PHPでのバリデーターの実装を書きました。



Kontrolioは「別のデータ検証ライブラリ」であり、フレームワークから独立して設計されており、拡張可能でサービスコンテナに優しいものです。 代替案: 尊重シリウス検証Valitronその他多数



理想的には、何らかの種類のサービスコンテナ( PHP-DIPHPリーグコンテナなど)の実装を使用していることを前提としているため、最初にKontrolioを登録する必要があります。



use Kontrolio\Factory; //  $container->singleton('validation', function() { return new Factory; }); //  $validator = $container->get('validation') ->make($data, $rules, $messages) ->validate();
      
      







コンテナをプロジェクトに実装することが困難な状況では、古き良き(実際にはない)シングルトンを使用できます。



 use Kontrolio\Factory; $validator = Factory::getInstance() ->make($data, $rules, $messages) ->validate();
      
      







検証プロセスはLaravelのプロセスに似ていることに気付くかもしれません。 実際、そこでの実装方法が気に入ったため、同様のソリューションを使用することにしました。 $ data$ルール 、および$ messagesは連想配列です。ここで、 $ dataはキーと値のペアの配列(多次元)であり、キーは検証する必要のある属性の名前です。 最も興味深いのは、検証ルールとエラーメッセージです。



検証ルールとエラーメッセージ



Kontrolioの検証ルールは、ルールクラスオブジェクトまたはクロージャで表すことができます。 クロージャーは、検証ルールを記述する最も簡単な方法です。



 $rules = [ 'attribute' => function($value) { return $value === 'foo'; } ]; $valid = $validator ->make(['attribute' => 'bar'], $rules) ->validate(); var_dump($valid); // false
      
      







バリデーターによって処理された終了ルールは、 Kontrolio \ Rules \ CallbackRuleWrapperクラスのオブジェクトにラップされるため、ルールクラスと同じオプションがすべてあり、このフォームでクロージャーを記述できます。



 'attribute' => function($value) { return [ 'valid' => $value === 'foo', 'name' => 'value_is_foo_rule', 'empty_allowed' => true, 'skip' => false, 'violations' => [] ]; }
      
      







クロージャーは、再利用が意図されていない単純なルールに便利です。 ただし、別の場所でルールを使用する場合は、別のルールクラスを記述してからそのオブジェクトを作成することをお勧めします。



 use Kontrolio\Rules\AbstractRule; class FooRule extends AbstractRule { public function isValid($input = null) { return $input === 'foo'; } } $rules = ['attribute' => new FooRule];
      
      





注:Kontrolioには、すぐに使用できる多くのルールが付属しています。



検証ルールのオプション



クロージャーの形式のルールレコードで、ルールがサポートするいくつかのオプションに気付きました。 以下の各オプションについて少し。



有効。 これは直接的な状態です。 ルールクラスに相当するのはisValidメソッドで、検証済みの属性値という1つの引数を取ります。 より明確にするために、特定の属性に検証ルールを設定する方法を示します。



 //   ,      . 'attribute' => function($value) { return $value === 'foo'; } //     ,      , //          'valid', //    . 'attribute' => function($value) { return [ 'valid' => $value === 'foo' //  ... ]; } //            //    isValid,    . use Kontrolio\Rules\AbstractRule; class FooRule extends AbstractRule { public function isValid($input = null) { return $input === 'foo'; } }
      
      







これらは、属性のルールを定義する最も簡単な方法です。



名前。 これは、ルールの名前または識別子です。 主に検証エラーメッセージを生成するために使用されます。



 $data = ['attribute' => 'invalid']; $rules = ['attribute' => new Email]; $messages = ['attribute.email' => 'The attribute must be an email']; $validator = $container->get('validation') ->make($data, $rules, $messages); if ($validator->validate()) { // } else { $messages = $validator->getErrors(); }
      
      







クラスに基づいてルールを作成する場合、ルール名/識別子を手動で設定する必要はありません。Kontrolio\ Rules \ AbstractRuleから継承すると、 getNameメソッドでこの機能がデフォルトで取得されるためです。 ただし、このメソッドをオーバーライドするだけで、ルールの名前を自由に変更できます。



empty_allowed。 このオプションは、属性値が存在する場合にのみ検証ルールを適用する必要がある状況で役立ちます。 クロージャーでは、次のようになります。



 'attribute' => function($value) { return [ 'valid' => $value === 'foo', 'empty_allowed' => true ]; }
      
      







このオプションでルールクラスを使用すると、2つの方法で属性に適用できます。



 //   'attribute' => FooRule::allowingEmptyValue() //      'attribute' => (new FooRule)->allowEmptyValue()
      
      







この場合、属性値に値「foo」が含まれているか空の場合、バリデーターは肯定的に応答します。



スキップ。 このオプションは、前のオプションとは異なります。 これにより、そのようなルールがまったくないかのように、属性のチェックをスキップするようバリデーターに指示する条件を指定できます。



 'confirmed' => function($value) { return [ 'valid' => (bool)$value === true, 'skip' => is_admin() ]; }
      
      







クラスルールに相当するものはcanSkipValidationメソッドで、まったく同じように機能します。



 class FooRule { public function isValid($input = null) { return (bool)$value === true; } public function canSkipValidation() { return is_admin(); } } $rules = ['confirmed' => new FooRule];
      
      







違反。 Symfonyからこの用語を親切に借りました。 「違反」を使用すると、ユーザーはより正確なエラーメッセージ(設定する必要があります)を取得できますが、以前のようにバリデーター自体は単にfalseを返します。



 $data = 'nonsense'; $rules = ['attribute' => new Email(true, true)]; $messages = [ 'attribute' => [ 'email' => "Something's wrong with your email.", 'email.mx' => 'MX record is wrong.', 'email.host' => 'Unknown email host.' ] ];
      
      







必要な数の「違反」を指定し、それぞれを使用して、最も一般的なメッセージから最も詳細な検証エラーまで、より詳細に検証エラーを説明できます。 例として、 Kontrolio \ Rules \ Core \ Emailクラスを参照してください。



属性にいくつかのルールを適用する



これに先立ち、すべての例で、1つの属性に対する1つのルールの説明が示されました。 しかし、もちろん、好きなだけ多くの属性にルールを追加できます:)さらに、クロージャーとクラスの使用を組み合わせることができます:



 $rules = [ 'some' => function($value) { return $value === 'foo'; }, 'another' => [ function($value) { return $value !== 'foo'; }, new FooBarRule, //   ... ] ];
      
      







もちろんすべてがクールですが、 ルールのセット全体を文字列として記述する別の興味深い方法があります。



 'attribute' => 'not_empty|length:5,15'
      
      







ここでは、各ルールは縦棒で区切られています。 私はこの考えをLaravelから借用しましたが、違いは、そのような行が規則の規則配列に「展開」されていることです。これは記事で複数回見ました。 したがって、この場合の上の行は、そのような配列の単なるシュガーです:



 'attribute' => [ new NotEmpty, new Length(5, 15) ]
      
      







コロンの後に記述したものはすべて、ルールクラスのコンストラクターの引数に直接分類されることに注意してください。



 'length:5, 15' -> new Length(5, 15)
      
      







したがって、ここで注意する必要があります。



属性検証を完全にスキップ



単一のルールをスキップしたり空の値を許可したりするだけでは十分ではないため、KontrolioにはLaravelとの類推で名前が付けられた特別なルールが含まれています- 「時々」クラスKontrolio \ Rules \ Core \ このルールを属性に追加すると、バリデーターに渡されたデータ配列にない場合、または値が空の場合、属性のチェックをスキップするようバリデーターに指示します。 このルールは常にリストの最初に配置する必要があります。



 $data = []; $rules = ['attribute' => 'sometimes|length:5,15']; $valid = $container ->get('validator') ->make($data, $rules) ->validate(); var_dump($valid); // true
      
      







前の例と同様に、これは次のように記述できます。



 $data = []; $rules = [ 'attribute' => [ new Sometimes, new Length(5, 15) ] ]; $valid = $container ->get('validator') ->make($data, $rules) ->validate(); var_dump($valid); // true
      
      







検証エラー出力



検証エラーは連想配列の形式で保存されます。キーは属性の名前で、値はメッセージ自体の配列です。



 $data = ['attribute' => '']; $rules = [ 'attribute' => [ new NotBlank, new Length(5, 15) ] ]; $messages = [ 'attribute.not_blank' => 'The attr. is required.', 'attribute.length.min' => 'It must contain at lest 5 chars' ]; $valid = $container ->get('validator') ->make($data, $rules) ->validate(); $errors = $validator->getErrors();
      
      







エラーダンプは次のようになります。



 [ 'attribute' => [ 0 => 'The attr. is required.', 1 => 'It must contain at lest 5 chars' ] ]
      
      







したがって、すべてのエラーを1行で表示するだけの場合は、 getErrorsListバリデータメソッドを使用します。 メッセージを含むフラット配列を返します。



 $errors = $validator->getErrorsList(); <ul class="errors"> <?php foreach($errors as $error): ?> <li class="errors__error"><?= $error; ?></li> <?php endforeach; ?> </ul>
      
      







より複雑なエラー出力には、 getErrorsメソッドを使用できます。 属性名でグループ化されたメッセージを返します。



 <ul class="errors"> <?php foreach ($errors as $attribute => $messages): <li class="errors__attribute"> <b><?= $attribute; ?></b> <ul> <?php foreach ($messages as $message): ?> <li><?= $message; ?></li> <?php endforeach; ?> </ul> </li> <?php endforeach; ?> </ul>
      
      







この話を締めくくる



これは、別のPHPデータ検証ライブラリであるKontrolioの使用方法です。 この記事を書いている間、私は単にドキュメントを書き直すだけでは十分ではないと考えました。 そのため、自分のライブラリを他のソリューションと比較しようとする記事を書く予定です。



読んでくれてありがとう!



All Articles