見出し画像

Laravel 学習記録 #012 バリデーションを学ぶ

Laravelのバリデーションについて学習したものをまとめてます。

バリデーションについて

  • 入力データを簡単に検証し、エラーがあればエラーメッセージを提供する仕組み

  • バリデーションルールが用意されている

  • 独自でバリデーションルールを作ることもできる

  • バリデーションに失敗するとIlluminate\Validation\ValidationException例外がスローされ、自動的にエラーレスポンスが生成


バリデーションを使ってみる

バリデーションを実装するには以下のいずれかの方法を使う

  • Illuminate\Http\Requestオブジェクトが提供するvalidateメソッド

  • Validatorファサード

  • フォームリクエスト

マニュアルでは

Laravelは、アプリケーションの受信データをバリデーションするために複数の異なるアプローチを提供します。すべての受信HTTPリクエストで使用可能なvalidateメソッドを使用するのがもっとも一般的です。

https://readouble.com/laravel/9.x/ja/validation.html

とありますが、ファットコントローラーになりそうなので、
フォームリクエストtが一番いいのではないでしょうか?

ベストプラクティスでも
バリデーションはコントローラからリクエストクラスに移動されてます。
https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md#バリデーション

と言うことで
フォームリクエストを使ったバリデーション方法について学習しました。
今回は基本ルールを設定する方法でやります。


フォームリクエストクラスを作成

まずは、専用のクラスを作成します。

php artisan make:request <ファイル名>

でapp/Http/Requests配下に
StorePostRequest.phpを作成

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        return [
            //
        ];
    }
}

authorize メソッド:認可についての設定 false を返すと、Laravelは403 Forbidden エラーを発生させるため、認可が関係なければtrueを設定

rulesメソッド:バリデーション内容を記述する


バリデーション内容を記述

titleというname属性に対して必須と文字数のバリデーションをする場合

public function rules(): array
    {
        return [
            'title' => 'required|max:10',
        ];
    }

とします。
複数ある場合は、左から順に実行されて、エラーがある時点で前ページへ戻ります。

ただ、このままだとメッセージが英語だったり、name属性がそのまま表示されたりするので修正が必要です。

メッセージを定義

フォームリクエストのクラス(StorePostRequest)に下記を追加

public function attributes(): array
    {
        return [
            'title' => 'タイトル',
        ];
    }

    public function messages(): array
    {
        return [
            // 'name属性.ルール' => '返すテキスト',
            'title.required' => ':attributeは必須です。',
            'title.max' => ':attributeは10文字以内で入力してください。',
        ];
    }

attributesメソッド:name属性に対しての命名を設定

messagesメソッド:name属性.ルールとして、返すメッセージを設定(name属性を埋め込むには:attributeを使う)


コントローラーでフォームリクエストを呼び出す

ではコントローラーで作成したフォームリクエストを使っていきましょう。
使い方は簡単で、アクションの引数にタイプヒントで設定するだけです。
public function メソッド(フォームリクエストクラス $変数)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\StorePostRequest;

class ValidateController extends Controller
{
    public function index()
    {
        return view('form');
    }

    public function store(StorePostRequest $request)
    {
        dd($request);

    }
}


確認できるようにviewを作成しておきます。

<form action="store" method="post">
        @csrf
        タイトル:<input type="text" name="title">
        <input type="submit" value="送信">
    </form>

    @if ($errors->any())
    <div>
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif

画面で空文字または、文字数超過でフォームを送信すると
画面にエラーメッセージが表示されます。
(バリデーションに失敗すると$errorsにエラーメッセージが格納されます。)
バリデーション通過するように入力した場合ddメソッドでリクエストの内容が確認できます。

このようにフォームリクエストで用意した場合
コントローラーアクションの処理が実行される前にバリデーションが済んでいることになるので、スッキリしますね。


この記事が気に入ったらサポートをしてみませんか?