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
クラスを追加して、 HelloController
の store
アクションを修正したので、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
コマンドで フォームリクエストを作成できる- フォームリクエストにおいて認可処理やバリデーションを実装できる