Laravelのカスタムバリデーションルールを追加する


laravel-custom-validation-rule

Laravelでは追加する必要のないくらい豊富なバリデーションルールが用意されています。
しかし、特に日本においてそれだけでは不十分な場合も多々あり、独自のバリデーションルールを追加したいことがあります。
そこで、Laravelのマニュアルで紹介されているを方法を単純に用いるのではなく、より使いやすくしたカスタムバリデーションルールをご紹介します。

ルールオブジェクトの問題点

マニュアルでは、

php artisan make:rule Uppercase

を実行してapp/Rulesディレクトリにルールオブジェクトを作成し、
バリデーション時にnewして利用する方法が紹介されていますが、

$request->validate([
    'name' => ['required', new Uppercase],
]);

この方法ではFormRequest内で利用することができませんでした。

そこで、ルールオブジェクトの下に記載されている「拡張の使用」を参考に追加していきます。

ServiceProviderを使う

まずは、ServiceProviderカスタムバリデーションルールを作ります。

ServiceProviderの作成

マニュアルでは、AppServiceProviderに記載していますが、バリデーション用に処理を分けたいので新しく作ります。

php artisan make:provider ValidationServiceProvider

次に、config/app.phpproviders配列に上記で作成したものを追加します。

'providers' => [
    // Other Service Providers
    ・・・
    App\Providers\ValidationServiceProvider::class,
],

カスタムバリデーションルールの作成

作成したValidationServiceProviderboot()メソッドに判定処理を追加します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class ValidationServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('uppercase', function ($attribute, $value, $parameters, $validator) {
            return strtoupper($value) === $value;
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Validator::extend()第1引数ルール名をば。
$valueにフォームで入力した内容が入ってくるので、それを使用して判定します。
日本では、ひらがな、カタカナ、それから郵便番号などを正規表現で判定するルールなどが欲しいところですね。

カスタムバリデーションルールの利用

最後に、作成したカスタムバリデーションルールFormRequestに追加しましょう。

FormRequestの作成

まずは、App/Http/RequestsFormRequestを作成します。

php artisan make:request CreateUserRequest

そして、FormRequestrules()メソッド内で、作成したカスタムバリデーションのルール名(この場合は”uppercase“)を記載することで利用できます。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreateUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required|uppercase',
        ];
    }
}

Controllerに追加

Controller側では上記で作成したFormRequestuseして、

use App\Http\Requests\CreateUserRequest;

下記のように引数に指定してあげればOK!

/**
 * Store a newly created resource in storage.
 *
 * @param \App\Http\Requests\CreateUserRequest $request
 *
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function store(CreateUserRequest $request)
{
    $requestData = $request->all();
    User::create($requestData);
    return redirect('users');
}

引数に指定するだけでバリデーション済みのリクエストが送られてくるので、コントローラ側で入力チェックをする必要はありません!
なんて便利!

参考サイト

今回はLaravelのフォームリクエストクラスを使ってバリデーションロジックをコントローラから分離します。案件によってはフォームの項目が多かったり複雑なバリデーションが必要だったりなど、コントローラにそのままバリデーションを書くと無駄に肥大化してしまい、...
Laravelのフォームリクエストクラスでバリデーションロジックをコントローラから分... - RitoLabo
## 追記(2018-02-09)Laravel5.2の時代に書いたものです。時間あるときに5.5にアップデートします。。。## フォームリクエストとは- フォームを含む各リクエストに対して、それぞれ固有のバリデーションを設...
Laravelのバリデーションにはフォームリクエストを使おう - Qiita - Qiita

コメント

このブログの人気の投稿

Linuxでファイルの改行コードLF⇔CRLFを変換する方法

RHEL 7でスタティック(静的)ルートを追加する4つの方法

SQLPlusでのOracleリモート接続とSQLファイルを実行する方法