Laravelでは追加する必要のないくらい豊富なバリデーションルールが用意されています。
しかし、特に日本においてそれだけでは不十分な場合も多々あり、独自のバリデーションルールを追加したいことがあります。
そこで、Laravelのマニュアルで紹介されているを方法を単純に用いるのではなく、より使いやすくしたカスタムバリデーションルールをご紹介します。
ルールオブジェクトの問題点
マニュアルでは、
| 1 | php artisan make:rule Uppercase | 
を実行してapp/Rulesディレクトリにルールオブジェクトを作成し、
バリデーション時にnewして利用する方法が紹介されていますが、
| 1 2 3 | $request->validate([     'name' => ['required', new Uppercase], ]); | 
この方法ではFormRequest内で利用することができませんでした。
そこで、ルールオブジェクトの下に記載されている「拡張の使用」を参考に追加していきます。
ServiceProviderを使う
まずは、ServiceProviderにカスタムバリデーションルールを作ります。
ServiceProviderの作成
マニュアルでは、AppServiceProviderに記載していますが、バリデーション用に処理を分けたいので新しく作ります。
| 1 | php artisan make:provider ValidationServiceProvider | 
次に、config/app.phpのproviders配列に上記で作成したものを追加します。
| 1 2 3 4 5 | 'providers' => [     // Other Service Providers     ・・・     App\Providers\ValidationServiceProvider::class, ], | 
カスタムバリデーションルールの作成
作成したValidationServiceProviderのboot()メソッドに判定処理を追加します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?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/RequestsにFormRequestを作成します。
| 1 | php artisan make:request CreateUserRequest | 
そして、FormRequestのrules()メソッド内で、作成したカスタムバリデーションのルール名(この場合は”uppercase“)を記載することで利用できます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?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側では上記で作成したFormRequestをuseして、
| 1 | use App\Http\Requests\CreateUserRequest; | 
下記のように引数に指定してあげればOK!
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | /**  * 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'); } | 
引数に指定するだけでバリデーション済みのリクエストが送られてくるので、コントローラ側で入力チェックをする必要はありません!
なんて便利!




コメント