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.phpのproviders配列に上記で作成したものを追加します。
'providers' => [
// Other Service Providers
・・・
App\Providers\ValidationServiceProvider::class,
],
カスタムバリデーションルールの作成
作成したValidationServiceProviderのboot()メソッドに判定処理を追加します。
<?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を作成します。
php artisan make:request CreateUserRequest
そして、FormRequestのrules()メソッド内で、作成したカスタムバリデーションのルール名(この場合は”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側では上記で作成したFormRequestをuseして、
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');
}
引数に指定するだけでバリデーション済みのリクエストが送られてくるので、コントローラ側で入力チェックをする必要はありません!
なんて便利!
- Original:https://minory.org/laravel-custom-validation-rule.html
- Source:Minory
- Author:管理者
