【Laravel】フォームリクエストの使い方とカスタマイズバリデーション

この記事からわかること

  • Laravelフォームリクエストとは?
  • 作成方法使い方メリット
  • バリデーションカスタマイズ方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelではバリデーションが簡単に行えるようにたくさんの機能を持っています。リクエストオブジェクトのvalidateメソッドは代表的な例ですが、今回はよりカスタマイズ性が高いフォームリクエストでのバリデーション方法をまとめていきたいと思います。

公式リファレンス:フォームリクエスト

フォームリクエストとは?

FormRequest(フォームリクエスト)」とはLaravelに常設されている機能の1つでフォームから送信されたリクエストを操作、拡張するためのリクエストインスタンスを継承したクラスです。

リクエストインスタンスとはフォーム送信された値やユーザー情報、ヘッダ情報などのリクエスト情報を保持しているクラスです。

フォームリクエストではフォーム利用に欠かせないバリデーション(値の検証)機能も簡単に実装することができます。

バリデーション機能はコントローラ側からリクエストインスタンスに紐づけられたvalidateメソッドを使うことでも実装可能ですが、リクエストデータの処理をコントローラで処理しなければならなくなります。

フォームリクエストを使用するとリクエスト作成時にバリデーション処理を挟むことができコントローラでの記述を無くし、よりすっきりとした構造のプログラムにすることができます。

  フォーム(ユーザ)
      ↓
  リクエスト作成(フォーム送信) ⇦バリデーション(フォームリクエスト)
      ↓  
  コントローラ ⇦バリデーション(validateメソッド)
      ↓  
  レスポンス作成
      ↓  
  レンダリング(ページ表示)

FormRequest(フォームリクエスト)のポイント

フォームリクエストの作成方法と使い方

FormRequest(フォームリクエスト)の作成〜使用までの流れ

フォームリクエストはartisanコマンドを使ってコマンドライン(ターミナル)から作成します。

$ php artisan make:request TestPostRequest

実行すると「app」>「Http」>「Requests」ディレクトリが作成されその中に「TestPostRequest.php」が作成されます。

TestPostRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return  array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

定義されている2つのメソッド

authorizeメソッドは一度飛ばして先にrulesメソッドとフォームリクエストの使い方と組み込み方法をまとめていきます。

バリデーションルールを定義する

バリデーションのルールはrulesメソッドの中にinput要素のname属性をキー値として、ルールを値にした連想配列形式で記述します。

public function rules()
{
    return [
      'name' => 'required|string|size:4',
      'email' => 'required|email',
      'name属性' => 'ルール1|ルール2',
    ];
}

細かいルールの使い方や種類はこちらの記事にまとめていますので参考にしてください。

フォームリクエストを使用可能にする

このままではまだフォームリクエストは使用できません。フォームリクエストはリクエストインスタンスを継承したクラスなのでコントローラ側からリクエストインスタンスを読み込むようにフォームリクエストも使用していきます。

// 通常のリクエストインスタンスの読み込み
use Illuminate\Http\Request;
// さらにフォームリクエストの読み込み
use App\Http\Requests\TestPostRequest;

続いてコントローラ側のアクションメソッドの引数にリクエストインスタンスの代わりにフォームリクエストを渡します。

public function index(TestPostRequest $request)
{
    return view('index');
}

アクションメソッド内での特別な処理は必要なく、引数に渡すだけでフォームの入力値がバリデーションされた状態でレスポンスを返すことができます。バリデーションエラーが発生した場合は自動で直前のURLにリダイレクトしてくれます。

コントローラ側からバリデーション値を操作する

バリデーション済みのデータを全て取得する

// バリデーション済みデータの取得
$input = $request->validated();

バリデーション済みの指定項目のみ取得する

$input= $request->safe()->only(['name', 'email']);

バリデーション済みの指定項目意外取得する

$input = $request->safe()->except(['name', 'email']);

authorizeメソッドを使った認証

authorizeメソッドではアクセスに対してフォームリクエストの使用を許可する(true)か拒否する(false)かをreturnする真偽値によって分岐させることができます。

例えばAuthを使った認証機能を使っていた場合、ログイン済みであればフォーム利用を可能にすると言ったことも可能です。

// Authの読み込み
use Illuminate\Support\Facades\Auth;
  
public function authorize()
{
    if (Auth::check()) {
        return true;
    } else {
        return false;
    }
}

おすすめ記事:Laravel/uiでVueとAuthの導入

authorizeメソッドでは最終的に返す真偽値によってフォームの使用を分岐できるのでカスタマイズの幅がグッと広がります。

エラーメッセージのカスタマイズ

フォームリクエストを定義するとエラー発生時のメッセージもカスタマイズも容易にできるようになります。

変更するにはフォームリクエストを定義しているファイルでmessagesメソッドを呼び出し上書き(オーバーライド)すればOKです。オーバーライドの意味ついては下記記事を参考にしてください。

TestPostRequest.php

public function messages()
{
    return [
        'name.required' => '名前は必須項目です',
        'email.email' => 'メールアドレスの形式で入力してください',
        'name属性.ルール名' => '変更後のメッセージ',
    ];
}

その中の連想配列で、キー値に項目名.ルール名を値側に変更したい実際のメッセージを記述します。

フォームリクエストを定義していない場合はエラーメッセージは「resources」>「lang」>「en」>「validation.php」の中のルールの記述を変更すればOKです。

validation.php

<?php

return [

    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    'email' => 'The :attribute must be a valid email address.',
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    'required' => 'The :attribute field is required.',
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

];

メッセージ内の:attributeの変更方法

デフォルトのエラーメッセージ(「validation.php」)にはname属性の値が自動で組み込まれる:attributeというプレースホルダーが用意されています。

:attributeを変更したい場合もフォームリクエストを定義しているファイルで今度はattributesメソッドを呼び出し上書き(オーバーライド)すればOKです。

TestPostRequest.php

public function attributes()
{
    return [
        'name' => 'お名前',
        'email' => 'E-Mail Address',
        'name属性' => '変更項目名',
    ];
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index