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