【初心者向け】Laravelのバリデーションの記載箇所

※本サイトはアフィリエイトリンクを掲載しています。
Laravel

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

 

コメント