Laravelのバリデーションを徹底解説
本章では、Laravelでバリデーションを実装する方法を解説していきます。
チュートリアルの全体像
本チュートリアルを通じて学べる内容は以下のようになります。
- Laravelの開発環境セットアップ
- Laravel Breezeで認証機能を導入
- Laravelのルーティングを徹底解説
- Laravelのコントーラーを徹底解説
- Laravelのブレイドを使ってみよう
- マイグレーションの仕組みを解説
- シーディングを使ってみよう
- Eloquentの基本と使い方を徹底解説
- 画像アップロードを実装する方法
- バリデーションを実装してみよう (now🐾)
- 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>
まとめ
以上、バリデーションについてでした。
次回は、認可についてです。
この記事へのコメントはありません。