Laravel - 16. アクション - フォームリクエスト

前節では Request クラスの validate メソッドによるバリデーションについて学習しました。今回のサンプルプログラムのようにリクエストパラメータが少ない場合は、アクションメソッドで入力チェックを実装するのも良いかもしれませんが、リクエストパラメータが多くなるとアクションメソッドの処理が長くなってしまいます。また複数のアクションメソッドにおいて、同様のバリデーションが必要になるケースもあるでしょう。

Laravelはこのような課題を解決するために、フォームリクエスト(Form Request)という仕組みをサポートしています。フォームリクエストは、入力フォームからのリクエストについて、認可処理やバリデーションを実装する仕組みです。ここでは前節で実装した HelloController クラスの store メソッドについて、フォームリクエストを適用するように修正してみます。

フォームリクエストの作成

フォームリクエストも php artisan make:request コマンドによって生成します。

$ php artisan make:request フォームリクエスト名

フォームリクエスト名にはフォームの内容を示すような名前を付けるとよいでしょう。ここでは単純なメッセージを扱うので MessageRequest という名前でフォームリクエストを生成します。

$ php artisan make:request MessageRequest
Request created successfully.

コマンドが成功すると app/Http/Requests/MessageRequest.php ファイルが生成されます。テキストエディタで開いてみましょう。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MessageRequest extends FormRequest
{
    public function authorize()
    {
        return false;
    }

    public function rules()
    {
        return [
            //
        ];
    }
}

FormRequest クラスを継承した MessageRequest クラスが定義されています。また MessageRequest クラスには authorize メソッド、 rules メソッドの2つが定義されています。前者の authorize メソッドは認可処理を実装するメソッドで、後者の rules メソッドはバリデーションを実装するメソッドです。ここでは rules メソッドの実装について見ていきます。

app/Http/Requests/MessageRequest.php ファイルを開いて次のように修正します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MessageRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            "text" => "required|max:10"
        ];
    }
}

まず認可処理である authorize メソッドについては今回は不要ですので、戻り値を true に変更している点に注意してください。戻り値が false のままだと利用時にHTTPステータスコード403が発生します。

次に rules メソッドでは前節と同様に連想配列で入力チェックを実装しています。ここでもリクエストパラメータ名をキー、キーに紐づく値にバリデーションルールを指定しています。ここではリクエストパラメータ text について、バリデーションルールとして必須チェック( required )と最大文字数チェック( max:10 )を定義しています。

次に HelloController クラスの store メソッドを修正します。テキストエディタで app/Http/Controllers/HelloController.php を修正します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Message;
use App\Http\Requests\MessageRequest;

class HelloController extends Controller
{
    public function index()
    {
        $title = "Hello Model!";
        $messages = Message::orderBy("id")->get();
        return view("hello/index", compact("title", "messages"));
    }

    public function create()
    {
        return view("hello/create");
    }

    public function store(MessageRequest $request)
    {
        $text = $request->input("text");
        $all = $request->all();
        $ua = $request->header("User-Agent");
        $path = $request->path();

        Log::debug("All:", $all);
        Log::debug("UA:" . $ua);
        Log::debug("Path:" . $path);

        return "Request parameters: " . $text;
    }
}

プログラムの先頭部分に use App\Http\Requests\MessageRequest; を追加して store メソッドの引数の型を MessageRequest 型に変更しています。これによりアクションメソッドの中で $request->validate メソッドを呼び出すことなくリクエストパラメータを検証できます。

動作確認

MessageRequest クラスを追加して、 HelloControllerstore アクションを修正したので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。

$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000

続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。

http://localhost:8000/hello/create

入力フォームが表示されるので、メッセージを空の状態で送信ボタンをクリックしてみましょう。

画面に入力エラーメッセージ(必須入力)が表示されます。

次に11文字以上の入力を試してみましょう。

この場合も同様に入力エラーメッセージ(文字数超過)が表示されます。

まとめ

  • 入力フォームからのリクエストはフォームリクエストを定義して処理できる
  • php artisan make:request コマンドで フォームリクエストを作成できる
  • フォームリクエストにおいて認可処理やバリデーションを実装できる