今回は上記のような質問に答えていきます。
【前提】
・laravel8.X
LaravelでFormRequestを使ってバリデーションをする方法
今回想定しているのは、「新規ユーザー作成時のバリデーション」です。
構成としては以下のような感じです。
コントローラーで、入力情報を受け取り、バリデーションに引っかかったらその時点で処理を終了させる形になります。
では、さっそく具体的な処理の書き方を紹介していきます。
各ファイルの中身を公開
多分、ファイルの中身を見たほうが早いと思うので、コントローラーとバリデーションクラスのファイルを紹介します。
ちなみに、今回は以下のデータがフォームから送られてくる設定とします。
・名前
・メールアドレス
・パスワード
・確認用のパスワード
↓コントローラー
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Requests\User\CreateUserRequest;
class UserController extends Controller
{
protected $createUserRequest;
public function __construct()
{
}
//「CreateUserRequest $createUserRequest」を指定するとバリデーションしてくれる
public function store(CreateUserRequest $createUserRequest)
{
//バリデーション済の$createUserRequestを使ってサービスクラスに処理をさせる
}
}
↓バリデーションクラス
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules;
class CreateUserRequest extends FormRequest
{
public function authorize()
{
return true; //ルーティングファイル、もしくはコントローラーで認証処理は行う前提なのでtrueで返す
}
/**
* 文字列は事前にサニタイズする
*/
protected function prepareForValidation()
{
if ($this->has('name')) {
$this->merge(['name' => e($this->name)]);
}
}
//バリデーションルールを設定できる
public function rules()
{
return [
'name' => ['required', 'string', 'max:255',], //必須、文字型、最大255文字
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
//必須、文字型、メール、最大255文字、usersテーブルでユニーク
'password' => ['required', 'confirmed', Rules\Password::defaults()]
];
}
}
上記で完了です。
実はメチャクチャ簡単です。
ちなみに、細かいバリデーションルールの設定については公式ドキュメントに記載されています。
あなたのケースに応じて柔軟に設定してみてください。
注意ポイント
formrequestを使ってバリデーションを構成するときの注意ポイント(ハマりポイント)を紹介します。
①authorize()
formrequest用ファイルのauthorizeメソッドではtrueを返しておくようにしましょう。
trueにしなかった場合「403 THIS ACTION IS UNAUTHORIZED」などのエラーが出ます。
ちなみに、ここでtrueを返すだけの記述にする場合(認証処理を書かない場合)はコントローラーかルーティングファイルで必ず認証処理を書いておいてください。
②prepareForValidation()
formrequest用ファイルのrulesメソッドにわたす前に処理をはさみたい場合はここに記述してください。
(rulesの後ではないので注意です)
今回は以上です。
ちなみに、Laravelの記事は以下で見ることができます。
よかったらどうぞ。