Laravel7 バリデーション機能の使い方

Laravel7 バリデーション機能の使い方

Laravel7でフォームから送信されたリクエストデータにバリデーションをかける方法を記述してます。

環境

  • OS windows10 pro 64bit
  • Composer 1.10.5
  • PHP 7.4.5
  • MariaDB 10.4.12
  • Laravel Framework 7.6.2

※windows10に Laravel のインストールはこちら
※windows10に Composer のインストールはこちら
※windows10に PHP のインストールはこちら
※windows10に MariaDB のインストールはこちら

bootstrap導入

レイアウトにbootstrapを利用しているので、詳しい手順はこちらに記述してますが、下記のコマンドで利用可能にしてます。

composer require laravel/ui
php artisan ui bootstrap
npm install && npm run dev

入力フォーム用コントローラー作成

まずはテスト用の入力フォームを作成していきます。
「NameController」という名前でコントローラーを作成します。

php artisan make:controller NameController

app/Http/Controllers/ NameController.phpが生成されているので、
formメソッドとバリデーションと確認用のshowメソッドを作成します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class NameController extends Controller
{
    public function form() {        
		return view('name.form');
    }

    public function show(Request $request) {
    // validatorを作成
		$validatedData = $request->validate([
       //required(必須)|min:2(最小2文字)|max:10(最大10文字)
            'name' => 'required|min:2|max:10',
        ]);
        	
		$name = array(
			'name' => $request->input('name'),        
        );
        
		return view('name.show', $name);
	}
}

入力フォーム用ビュー作成

次にレイアウト部であるviewを作成します。

resources\views内で「name」というフォルダを作成して「form.blade.php」を下記の内容で、新たに作成します。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>入力フォーム</title>    
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div class="mx-auto" style="margin-top: 100px; width: 800px;">
        @if ($errors->any())
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
        @endif
        <form method="POST" action="/name/show">
            @csrf
            <div class="form-group">
                <label>名前</label>
                <input type="text" class="form-control" name="name" value="{{ old('name') }}">                
            </div>
            <input type="submit"  class="btn btn-primary mb-2" value="送信">
        </form>
    </div>
</body>
</html>

@csrf は Bladeテンプレート機能の1つで、CSRF対策となります。

下記のコードがerrorメッセージを表示する箇所となります。

@if ($errors->any())
<div class="alert alert-danger">
    <ul>
        @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
        @endforeach
    </ul>
</div>

oldは、入力エラー時の値を取得することができます。

{{ old('name') }}

次に resources\views\name内でリクエストデータ取得用の「show.blade.php」を下記の内容で、新たに作成します。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>入力フォーム表示</title>
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">   
</head>
<body>
    <div class="mx-auto" style="margin-top: 100px; width: 800px;">
        <div class="form-group">
            <label>名前 {{ $name }}</label>            
        </div>       
    </div>
</body>
</html>

ルーティング追加

アクセスするURLを設定するため、ルーティングを記述します。
ここでは/nameに設定します。

Route::get('/name', 'NameController@form');
Route::post('/name/show', 'NameController@show');

確認

ブラウザから http://localhost:8000/name にアクセスしてみて、バリデーションが有効になっていることが確認できます。