ホームページ > バックエンド開発 > PHPチュートリアル > Laravelのデータ検証:正しい方法 - カスタムバリデーター

Laravelのデータ検証:正しい方法 - カスタムバリデーター

Christopher Nolan
リリース: 2025-02-20 11:35:11
オリジナル
292 人が閲覧しました

Data Validation in Laravel: The Right Way - Custom Validators

Laravelのデータ検証:正しい方法 - カスタムバリデーター

キーテイクアウト

  • Laravelの組み込みデータ検証パッケージを拡張して、スペースを含むフルネームやPINコードの検証など、特定のニーズのカスタム検証ルールを作成できます。 LaravelのIlluminateValidationValidatorクラスを拡張し、データとそれぞれのエラーメッセージを検証する新しいメソッドを追加することにより、カスタム検証ルールが作成されます。
  • 新しい検証ルールは、「検証」プレフィックスとタイトルの残りの名前に名前が付けられている必要があります。検証ルールは、メソッドの名前が付けられているもの(「検証」プレフィックスなしで)の小文字で行われ、各単語はアンダースコアによって分離されます。
  • カスタム検証ルールを作成した後、これらのルールをLaravelの検証パッケージにバインドするために、サービスプロバイダーを作成する必要があります。このサービスプロバイダーは、app/config/app.phpファイルを介してlaravelによってロードされます。
  • 前のパートでは、Laravelのデータ検証パッケージを使用してLaravelのデータを検証する方法と、ドライの原則でコードを再利用可能にするためにエンティティ固有のサービスにデータ検証を抽象化する方法を学びました。これで、それぞれの検証ルールを使用して、アプリの各エンティティの検証サービスを簡単に作成し、データを検証し、エラーを簡単にフェッチおよび表示する場所に挿入できます。
  • しかし、もっと欲しいとしたらどうしますか?
  • このチュートリアルのソースコードは、こちらから入手できます。このコードを実行する前に、Project Directory内にLaravel FrameworkをインストールするためにComposerインストールを実行する必要があります。

もっと

の必要性

箱から出して、Laravelは多くの有用で一般的な検証ルールを提供します。しかし、もっと欲しいとしたらどうでしょうか?もっと具体的なものが必要な場合はどうなりますか?ここの例では、TestFormValidatorではAlpha_Dashを使用して名前を検証しましたが、フルネームを検証するのは理想的ではありません。一般的に、人のフルネームは、名と姓、そしておそらくミドルネームで構成されます。これらはすべてスペースによって分離されます。同様に、フォームでピンコードを検証したい場合は、Laravelが提供するAlpha_Numルールを使用できない場合は、スペースも許可することができるはずです。

さて、Laravelは、検証パッケージを簡単に拡張し、カスタム検証ルールを追加するオプションを提供します。 Rocketcandy/services/validation/create validatorextended.phpを作成し、次のコードを追加します。
<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
ログイン後にコピー
ログイン後にコピー

ここで、私たちのクラスはLaravelのIlluminateValidationValidatorクラスを拡張し、2つの新しい方法(validatealphadashspaces()とvalidatealphanumspaces())を追加します。検証されているデータフィールド。

ここで注意すべきことは、私たちが方法の名前を付ける方法です。すべての検証ルールメソッド名には、検証プレフィックスが必要であり、残りの部分はタイトルケース(もちろんスペースなし)でなければなりません。検証ルールは、メソッドの名前が付けられているもの(検証プレフィックスなしで)の小文字で行われ、各単語はアンダースコアによって分離されます。したがって、alpha_dash_spaces検証ルールを追加する場合、対応するメソッドはvalidatealphadashspaces()と呼ばれます。

したがって、alpha_dash_spacesとalpha_num_spacesの検証ルールをここに追加しました。 alpha_dash_spacesは文字、ダッシュ(ハイフンとアンダースコア)、およびスペースを許可しますが、alpha_num_spacesは文字、数字(数字0〜9)、スペースのみを許可します。

これはまだ終わっていませんが、このクラスはLaravelの検証クラスのみを拡張しています。 Laravelにそれを認識させる必要があります。そのため、上記のVaidationサービスに新しいルールを追加すると、Laravelはそれらのルールに従って検証を実行する方法を知っています。

laravel docsは、これを行うことができると述べています

> app/start/global.phpに貼り付けるか、app/start/global.phpにそのファイルをロードしてロードして、app directory内に新しいファイルを作成します。しかし、それはそれほどきれいに見えず、私たちが変更する必要のないファイルを変更して、あちこちにビットやピースを貼り付けます。いいえ、このすべての検証関連コードを一緒に保持したいので、サービスプロバイダーを作成し、カスタム検証ルールをLaravelの検証パッケージに接着します。

balidationextensionserviceprovider.phpを作成します。

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
ログイン後にコピー
ログイン後にコピー
通常、必要なバインディングを行うためにregister()メソッドを使用する前に、Laravelでサービスプロバイダーを作成した場合。ここで拡張したのは、抽象クラスIlluminateSuportServiceProviderの唯一の抽象的な方法です。レジスタ()で検証拡張機能を接着できない理由は、サービスプロバイダーがLaravelによって読み込まれ、Laravelが後で検証パッケージを初期化するため、私たちにスローされた例外のボレーに遭遇するので、それが起動されるためです。存在しないオブジェクトを使用して存在しないものを拡張しようとしています。一方、Boot()メソッドはリクエストがルーティングされる直前に起動されるため、Laravelの検証パッケージに物を安全に接着できます。

ここで、Laravelにこのサービスプロバイダーをロードするように指示する必要があります。すべてが設定されます。アプリ/config/app.phpを開き、プロバイダーで配列の最後に次のものを追加します。

<span><span><?php
</span></span><span>
</span><span><span>namespace RocketCandy<span>\Services\Validation</span>;
</span></span><span>
</span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator;
</span></span><span>
</span><span><span>class ValidatorExtended extends IlluminateValidator {
</span></span><span>
</span><span>	<span>private $_custom_messages = array(
</span></span><span>		<span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.",
</span></span><span>		<span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.",
</span></span><span>	<span>);
</span></span><span>
</span><span>	<span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
</span></span><span>		<span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes );
</span></span><span>
</span><span>		<span>$this->_set_custom_stuff();
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Setup any customizations etc
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@return <span>void</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function _set_custom_stuff() {
</span></span><span>		<span>//setup our custom error messages
</span></span><span>		<span>$this->setCustomMessages( $this->_custom_messages );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, spaces and dashes (hyphens and underscores)
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaDashSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span>	<span>/**
</span></span><span><span>	 * Allow only alphabets, numbers, and spaces
</span></span><span><span>	 *
</span></span><span><span>	 * <span>@param <span>string</span> $attribute
</span></span></span><span><span>	 * <span>@param <span>mixed</span> $value
</span></span></span><span><span>	 * <span>@return <span>bool</span>
</span></span></span><span><span>	 */
</span></span><span>	<span>protected function validateAlphaNumSpaces( $attribute, $value ) {
</span></span><span>		<span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value );
</span></span><span>	<span>}
</span></span><span>
</span><span><span>}	//end of class
</span></span><span>
</span><span>
</span><span><span>//EOF</span></span>
ログイン後にコピー
ログイン後にコピー

さて、App/RocketCandy/Services/Validation/TestFormValidator.phpを開き、$ルールプロパティを更新して、次のようになります。

<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) {
</span>	<span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages );
</span><span>} );</span>
ログイン後にコピー
ログイン後にコピー
名前のalpha_dash検証ルールをalpha_dash_spaces、alpha_num_spacesを使用してpin_codeのalpha_numに置き換えました。

今、http:// /dummy/createにナビゲートすると、問題なく名前とピンコードフィールドにスペースを入力できます。

要約

したがって、この2つのパートチュートリアルでは、次のことを学びました

内蔵データ検証パッケージを使用して、Laravelのデータを検証します。

オブジェクト指向のアプローチを使用して、データ検証を独自のサービス(

単一の責任
    達成のロック解除)に抽象化します。
  1. データ検証サービスで使用する独自のカスタム例外を作成します(True/False Boolean値を使用する代わりに)およびエラーからエラーを保存および取得する方法。
  2. データ検証サービスをコントローラーに挿入して使用します。
  3. カスタム検証ルールを使用してLaravelの検証パッケージを拡張し、サービスプロバイダーを使用して自動ロードします。 脚注
  4. このチュートリアルをポイントまで保持するために、コントローラーに検証サービスを注入し、そこで使用しました。現実のプロジェクトでは、データの消毒とストレージを処理する他の場所で検証サービスを使用する可能性が高いでしょう。理想的には、コントローラーは脂肪がなく、最小限のコードを持っている必要があります。
  5. 考えがありますか?質問?コメントで発射します。
  6. Laravelデータ検証とカスタムバリデーターについてよく尋ねる質問
  7. データ検証にLaravelを使用することの利点は何ですか?
  8. ​​
Laravelは、データ検証のための堅牢で柔軟なシステムを提供する一般的なPHPフレームワークです。データに簡単に適用できるさまざまな検証ルールを提供し、処理される前に必要な標準を満たすようにします。 Laravelの検証システムでは、カスタム検証ルールも許可されているため、データ検証のための独自の基準を定義する機能が得られます。これは、Laravelの組み込み検証ルールでカバーされていない方法でデータを検証する必要がある場合に特に役立ちます。 Balidator :: Extend Methodを使用してカスタム検証ルールを作成します。このメソッドは、検証ルールの名前と、属性名、属性値、および失敗コールバックの3つの引数を受信する閉鎖の2つのパラメーターを取ります。閉鎖内で、カスタム検証ルールのロジックを定義できます。検証が失敗した場合は、適切なエラーメッセージを使用して障害コールバックを呼び出す必要があります。

カスタムルールでLaravelの組み込みの検証ルールを使用できますか?

​​

はい、Laravelを使用すると、カスタムルールとともに組み込みの検証ルールを使用できます。これは、検証ロジックで検証ルールを一緒にチェーンすることで実行できます。たとえば、「必須」ルールを使用してフィールドが空でないことを確認し、カスタムルールを使用してデータの形式を検証できます。

Laravelを使用すると、ビューに検証エラーメッセージを簡単に表示できます。検証が失敗すると、Laravelはセッションに保存されているすべての検証エラーを使用して、ユーザーを以前の場所にリダイレクトします。次に、$エラー変数を使用してビューにこれらのエラーを表示できます。これは、Laravelによってすべてのビューで自動的に利用可能になります。

カスタム検証ルールのエラーメッセージをカスタマイズできますか?はい、Laravelを使用すると、カスタム検証ルールのエラーメッセージをカスタマイズできます。これは、言語ファイルでカスタムメッセージを定義し、検証ロジックでこれらのメッセージを参照することで実行できます。これにより、アプリケーションの特定のニーズに合わせてエラーメッセージを調整する柔軟性が得られます。

laravelで配列を検証するにはどうすればよいですか?

laravelは、「ドット表記」を使用して配列を検証する便利な方法を提供します。検証する配列フィールドを指定してから、検証ルールを適用できます。たとえば、電子メールの配列がある場合は、「電子メール」検証ルールを使用して配列内の各電子メールを検証できます。 Laravelを使用すると、条件付き検証ルールを使用できます。これは、他の条件が満たされている場合にのみ、特定の検証ルールを適用できることを意味します。これは、balidatorインスタンスの時々メソッドを使用して実行できます。

laravelでファイルアップロードを検証するにはどうすればよいですか?

laravelは、「ファイル」、 'などのファイルアップロードのいくつかの検証ルールを提供します。画像 '、「Mime」、および「サイズ」。これらのルールを使用すると、アップロードされたファイルのタイプとサイズを検証し、アプリケーションの要件を満たすようにします。フォームリクエストのカスタム検証ルール。これは、フォームリクエストクラスのルール方法でルールを定義することで実行できます。フォームリクエストデータを検証するときにこれらのルールを使用できます。

laravelで検証障害を処理するにはどうすればよいですか?

LARAVELで検証が失敗した場合、ユーザーを前の場所に自動的にリダイレクトしますすべての検証エラーがセッションに保存されています。その後、これらのエラーをビューで処理し、アプリケーションに適した方法でユーザーに表示できます。

以上がLaravelのデータ検証:正しい方法 - カスタムバリデーターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート