1. HOME
  2. ブログ
  3. エンジニアリング
  4. Laravelのバリデーションを徹底解説

BLOG

ブログ

エンジニアリング

Laravelのバリデーションを徹底解説

本章では、Laravelでバリデーションを実装する方法を解説していきます。

チュートリアルの全体像

本チュートリアルを通じて学べる内容は以下のようになります。

  1. Laravelの開発環境セットアップ
  2. Laravel Breezeで認証機能を導入
  3. Laravelのルーティングを徹底解説
  4. Laravelのコントーラーを徹底解説
  5. Laravelのブレイドを使ってみよう
  6. マイグレーションの仕組みを解説
  7. シーディングを使ってみよう
  8. Eloquentの基本と使い方を徹底解説
  9. 画像アップロードを実装する方法
  10. バリデーションを実装してみよう (now🐾)
  11. Laravelで認可処理を実装しよう

動画で学びたい方はこちらから!

バリデーションとは

バリデーションとは、入力値を検証する機能です。ユーザから送られてきたデータは必ずしもシステムにあったデータとは限らないため、チェックする必要があります。

例えば、ブログ記事の投稿時、ユーザがタイトルを入れていなかった場合、

タイトルを入力してください。

などとメッセージを出してあげる感じです。

webサービスを使っているとよくこのようなメッセージに出くわすと思うので、イメージしやすいと思います。

説明はこれくらいにして、さっそくバリデーションを実装してみましょう!

フォームリクエスト作成

バリデーションを実装するために、フォームリクエストクラスを作成します。

php artisan make:request StorePostRequest
php artisan make:request UpdatePostRequest

app/Http/Requestsのフォルダ内に以下のファイルが作成されます。

  • StorePostRequest.php
  • UpdatePostRequest.php

バリデーション定義

app/Http/Requests/StorePostRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'image' => ['required', 'image', 'mimes:jpeg,jpg,png'],
            'caption' => ['required', 'string', 'max:255'],
        ];
    }

    public function messages(): array
    {
        return [
            'image.required' => '画像を選択してください。',
            'image.image' => '画像形式が正しくありません。',
            'image.mimes' => '画像形式が正しくありません。',
            'caption.required' => 'キャプションは必須です。',
            'caption.max' => 'キャプションは255文字以内で記入してください。',
        ];
    }
}

app/Http/Requests/UpdatePostRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdatePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }
  
    public function rules(): array
    {
        return [
            'caption' => ['required', 'string', 'max:255'],
        ];
    }
    
    public function messages(): array
    {
        return [
            'caption.required' => 'キャプションは必須です。',
            'caption.max' => 'キャプションは255文字以内で記入してください。',
        ];
    }
}

フォームリクエストを適用

フォームリクエストが作成できたら、コントローラーにて適用していきます。

コントローラーのアクションのリクエスト部分の型指定をフォームクラスに変更するだけで適用されます。

app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class PostController extends Controller
{


    /**
     * Store a newly created resource in storage.
     */
    public function store(StorePostRequest $request)
    {
        // 省略
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(UpdatePostRequest $request, Post $post)
    {
        // 省略
    }

}

エラーメッセージ表示

最後にエラーメッセージを表示してみましょう。

resources/views/posts/create.blade.php


<form method="POST" action="/posts" enctype="multipart/form-data" class="bg-white p-4 mt-8">
    @csrf
    @if ($errors->any())
        <div class="my-4">
            <ul>
                @foreach ($errors->all() as $error)
                    <li class="text-red-500">{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
    <x-input-label name="image" value="画像" class="mb-2"/>
    <!--省略-->
</form>

resources/views/posts/edit.blade.php

<form method="POST" action="/posts/{{$post->id}}">
    @csrf
    @method('PUT')
    @if ($errors->any())
        <div class="my-4">
            <ul>
                @foreach ($errors->all() as $error)
                    <li class="text-red-500">{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
    <h3 class="font-semibold mt-2">キャプション</h3>
    <x-textarea name="caption" rows="8" class="mt-2">{{ $post->caption }}</x-textarea>
    <div class="flex items-center mt-4">
        <x-primary-button type="submit">更新</x-primary-button>
        <a href="/posts/{{$post->id}}" class="text-xs border p-2 rounded ml-4">
            投稿画面へ
        </a>
    </div>
</form>

まとめ

以上、バリデーションについてでした。

次回は、認可についてです。

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事