Laravelのカスタムリクエストが何かと使い方

Laravelのカスタムリクエストが何かと使い方

18 回閲覧されました

みなさんこんにちは、jonioです。

今回はカスタムリクエストについてのメモです。

Laravelの無料学習サイトを作りました

Laravelを勉強したい人向けの無料の学習サイトを作りました。

ここからリンクに飛べますのでぜひ利用してください。

カスタムリクエストとは

フォームから送信したデータをコントローラーに渡す前にチェックする為にあります。

チェックとは指定した型になっているか・文字数は適切になっているかなどのバリデーションのことです。

無理矢理不正な値を入力してテーブルをいじることができないようにする為に使えます。

作成コマンド

下記になります。

php artisan make:request DemoRequest

「DemoRequest」は任意の名称です。

コマンドを叩くと「Laravelのプロジェクト > app > Http > Requests > DemoRequest.php」が作成されます。

初期表示は下記です。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class DemoRequest 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<mixed>|string>
     */
    public function rules(): array
    {
        return [
            //
        ];
    }
}

カスタムリクエストを使えるようにするには14行目の「false」を「true」に変えます。

実際に簡単なコードでカスタムリクエストを使ってみます。

サンプルデータとカスタムリクエストと説明

下記の送信データにカスタムリクエストを使ったとします。

{
  "arrays": [
    {
      "dataA": "A",
      "detaB": 10
    },
    {
      "detaA": "B2",
      "detaB": 28
    }
  ]
}

カスタムリクエストは下記にしたとします。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
            'arrays.*.detaB' => 'required|integer|min:0|max:11',
        ];
    }

    public function attributes()
    {
        return [
            'arrays.*.dataA' => '文字',
            'arrays.*.detaB' => '数字',
        ];
    }

    /**
     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            'required' => ':attribute は必須です。',
            'arrays.*.detaA.regex' => '文字に数字を含まないでください。',
            'arrays.*.detaB.integer' => '11以下の数字を入力してください。',
        ];
    }   
}

attributes・messageメソッドは追記しています。

メソッド「rules」・「attributes」・「messages」について説明します。

rules

バリデーションのルールを設定します。

今回のデータは以下ですが「arrays.*.dataA」の「arrays」が2行目の「arrays」に対応しています。

{
  "arrays": [
    {
      "dataA": "A",
      "detaB": 10
    },
    {
      "detaA": "B2",
      "detaB": 28
    }
  ]
}

「arrays.*.dataA」の「*」は配列のインデックス番号になります。

今回のデータの配列は2つありますが例えば直接「arrays[0][‘dataA’]」・「arrays[1][‘dataA’]」と書くのは面倒です。

だからまとめて「arrays.*.dataA」と記載します。

バリデーションルールは下記になっています。

'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
'arrays.*.detaB' => 'required|integer|min:0|max:11',

「=>」の右側はバリデーションのルールです。

attributes

これはバリデーションエラーメッセージで使う時の名称の設定です。

下記になっています。

'arrays.*.dataA' => '文字',
'arrays.*.detaB' => '数字',

「=>」の右側で名称を設定しています。

これはmessagesメソッドで使います。

messages

バリデーションエラーメッセージで表示する内容を設定します。

下記になっています。

'required' => ':attribute は必須です。',
'arrays.*.detaA.regex' => '文字に数字を含まないでください。',
'arrays.*.detaB.integer' => '11以下の数字を入力してください。',

1行目の「:attribute」は先ほど説明したattributesメソッドでの名称に該当します。

attributesメソッドには下記の記述をしていました。

'arrays.*.dataA' => '文字',
'arrays.*.detaB' => '数字',

だから「:attributes」は文字または数字になります。

2行目の「arrays.*.dataA.regex」の「regex」はrulesメソッド(下記)で設定しています。

'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
'arrays.*.detaB' => 'required|integer|min:0|max:11',

「required|max:2|regex:/^[A-Za-z]+$/」の「regex」のことです。

「arrays.*.dataA.regex」で「regex」のバリデーションに引っかかった時を意味しています。

「文字に数字を含まないでください。」はバリデーションエラーメッセージです。

他にも「arrays.*.dataA.max」や「arrays.*.dataB.integer」などとすることもできます。

くどいですが今回送信するデータは下記です。

{
  "arrays": [
    {
      "dataA": "A",
      "detaB": 10
    },
    {
      "detaA": "B2",
      "detaB": 28
    }
  ]
}

インデックス番号が1の時のdataA(B2の2が含まれている)とdataB(最大数値よりも大きい)がバリデーションに引っかかっています。

だから「文字に数字を含まないでください。」・「11以下の数字を入力してください。」のバリデーションエラーが表示されます。

コントローラーでの使い方

下記の記述をします。

use App\Http\Requests\DemoRequest;

public function saveOrUpdate(KwkkrRequest $request)
{
    $formData = $request->validated();
}

これでカスタムリクエストを適用できます。