【Laravel】Validatorファサードで独自ルールの作り方!sometimesやextend

【Laravel】Validatorファサードで独自ルールの作り方!sometimesやextend

この記事からわかること

  • Laravelバリデーションとは?
  • コントローラで使えるValidatorファサードメソッド
  • sometimesメソッドで条件次第でルールを追加
  • extendメソッドで独自ルールをカスタマイズ

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelの値を検証できる機能、Validatorファサードでできる機能をまとめていきたいと思います。またこの記事は前回の続きです。使い方やメリットなどは以下記事を参考にしてください。

sometimesメソッド:条件分岐でルールを追加

参照記事:公式リファレンス-Validatorファサード:条件分岐-

Validatorファサードでは特定の条件の時のみルールを追加するといった動的なバリデーションが可能です。

条件を識別してルールを追加するにはValidatorファサードのsometimesメソッドの引数に、条件に合致した場合に検証させたい項目名、ルール名、そしてその条件を渡します。

$validator->sometimes(項目名,ルール名,クロージャ(条件));

このメソッドを使えば「"年齢"が20以上の場合は"子供の人数"を必須にする」などといった入力値に対して動的にルールを変更させることが可能になります。

クロージャ(関数)には引数に$inputを受け取ることができここから入力値の値にアクセスすることができます。条件分岐は返す真偽値によって決定します。trueであれば追加で検証を実行してくれます。

クロージャ(条件)の中身

function ($input) {
    return 真偽値;
};

実際の使用例

$validator->sometimes('child', 'required|max:5', function ($input) {
    return $input->age >= 20;
});

実際の使用例(複数)

$validator->sometimes(['child', 'marriage'], 'required', function ($input) {
    return $input->age >= 20;
});

extendメソッド:独自のルールを追加する

参照記事:公式リファレンス-Validatorファサード:独自ルールの拡張-

Validatorファサードではさらに独自のバリデーションルールを作成し検証させることも可能です。

作成するには静的メソッドであるextendを使用します。引数に独自のルール名、ルールの関数を定義します。

Validator::extend(独自のルール名,クロージャ(ルール));

クロージャ(関数)には4つの引数を受け取ることができ、最終的に真偽値を返してバリデーションの結果を明示します。

クロージャ(ルール)の中身

function ($attribute, $value, $parameters, $validator) {
    return 真偽値;
};

4つの引数でアクセスできる値

  1. $attribute:項目名(name属性)
  2. $value:入力値
  3. $parameters:ルールに渡される引数
  4. $validator:Validatorインスタンス

Validatorファサードで独自ルールを追加するには?

extendメソッドは拡張してルールを追加できるメソッドですが、ではどこに記述すれば良いのでしょうか?

答えは「サービスプロバイダとして登録する」です。

サービスプロバイダの作成は専用のartisanコマンドがあるので実行します。

$ php artisan make:provider ExtendValidatorServiceProvider

これで「app」>「Providers」ディレクトリ内に「ExtendValidatorServiceProvider.php(名前は自由)」が作成されました。

上部にValidatorファサードが使えるように読み込み文を追加します。

use Illuminate\Support\Facades\Validator

続いて自動実行されるbootメソッドにextendを使った独自ルールを定義していきます。今回は適当にルール名をhello、ルールは入力値がhelloならOKというルールにしておきます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
// 追加
use Illuminate\Support\Facades\Validator;

class ExtendValidatorServiceProvider extends ServiceProvider
{
    /**
     * 全アプリケーションサービスの登録
     *
     * @return  void
     */
    public function register()
    {
        //
    }

    /**
     * 全アプリケーションサービスの初期起動
     *
     * @return  void
     */
    public function boot()
    {
        Validator::extend('hello', function ($attribute, $value, $parameters, $validator) {
            return $value == 'hello';
        });
    }
}

サービスプロバイダはこのままでは使用できませんので登録処理をしておきます。

config > app.php

'providers' => [
    // 追加
    App\Providers\ExtendValidatorServiceProvider::class,
],

登録するには「config」>「app.php」providers配列に作成したサービスプロバイダを追加すればOKです。

これで独自ルールの追加が完了しました。あとは設定したルール名(今回はhello)をルールとして記述するだけでオリジナルのバリデーションが可能です。

$validator = Validator::make($request->all(), [
            'email' => 'required|email',
            // 独自のルールを通常のルールに混じって使用できる
            'title' => 'required|hello',
            'body' => 'required',
        ]);

これではまだエラーメッセーがvalidation.helloといった初期値で表示されてしまうのでエラーメッセージのカスタマイズもしておくことをおすすめします。

エラーメッセージのカスタマイズ方法はこちらの記事を参考にしてください。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index