Laravelのバリデーションルールはどのファイルに記載するのが適切でしょうか。
ソース管理しやすいようにバリデーションルール用のファイルに分けて記載したいですよね。
Controllerに記載するとボリュームがとんでもないことになります。
Controllerはロジックを記載して、Controllerからバリデーションルール記載のファイルを読み込むようにしたいです。
本記事でLaravelのFormRequestでバリデーション設定をする方法について紹介します。
本記事の内容
・参考例ソース
参考例ソース
ルーティングファイル
web.php
// 入力画面
Route::get('/inquiry/index', [InquiryController::class, 'index'])->name('inquiry.index');
// 登録処理
Route::post('/inquiry/register', [InquiryController::class, 'register'])->name('inquiry.register');
Controllerファイル
InquiryController.php
<?php
namespace App/Http/Controllers;
use App/Models/Inquiry;
use Illuminate/Http/Request;
use App/Http/Requests/InquiryRequest;
class InquiryController extends Controller
{
public function index()
{
return view('inquiry.index');
}
public function register(InquiryRequest $request)
{
// 以下登録処理
}
}
バリデーションファイルのInquiryRequest.phpを使えるように指定します。
バリデーションルール記載ファイル
ファイル生成コマンド
php artisan make:request [作成クラス名]
InquiryRequest.php
<?php
namespace App/Http/Requests;
use Illuminate/FoundationHttp/FormRequest;
class InquiryRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|max:255',
'email' => 'required|email:filter,dns',
];
}
}
InquiryRequest.phpでバリデーションルールを設定しています。
authorize
関数の中身はコマンドでファイルを生成する場合、デフォルトでfalseになっているのでtrueに変えて使用する必要があります。
日本語化
validation.php
'attributes' => [
'name' => 'ユーザー名',
'password' => 'パスワード',
'email' => 'メールアドレス'
],
Bladeファイル
index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>お問い合わせフォーム</title>
</head>
<body>
<h1>お問い合わせフォーム</h1>
<form action="{{ route('inquiry.register') }}" method="POST">
@csrf
<div>
<label for="name">ユーザー名</label>
<input type="text" name="name" value="{{old('name')}}">
</div>
@error('name')
<p style="color:red">{{$message}}</p>
@enderror
<br/>
<div>
<label for="email">メールアドレス</label>
<input type="text" name="email" value="{{old('email')}}">
@error('email')
<p style="color:red">{{$message}}</p>
@enderror
</div>
<br/>
<div>
・・・以下省略・・・
</div>
<br/>
<div>
<input type="submit" value="登録">
</div>
</form>
</div>
</body>
</html>
バリデーションルールに合わず、バリデーションエラーとなる場合は、
直前のURLにリダイレクトされます。つまり上記のbladeファイルが表示されます。
oldヘルパーを使用して、バリデーションエラー時のそれぞれの値を保持して表示することができます。
エラー表示
上記bladeファイルの@error('name')
のようにして、それぞれの値のエラーメッセージの有無を確認できます。そして$messageへエラーメッセージの値を渡すことができるのでエラー内容が表示できます。
エラー内容をまとめて表示したい場合は、下記のようにもできます。
@foreach ($errors->all() as $error)
{{$error}
@endforeach
コメント