この記事を書いた時に使ったLaravelのバージョンはv10.48.10です。
LaravelにはFormRequestというユーザーからのリクエストを管理するクラスがあります。これを使うとバリデーションやリクエストパラメータの取得が容易になります。FormRequestはその目的からかクラス外からは読み取りしかできません。これをあえて書き込みできるようにする方法を紹介します。
実際のコードが次です。
<?php namespace App\Http\Requests; class CanRewritePostRequest extends \Illuminate\Foundation\Http\FormRequest { /** * コントローラ以降でPOSTされた値を変更するためのメソッド */ public function setPost(string $key, mixed $value): void { // 内部にリクエストの値を持っているので、それを変更する $this->request->set($key, $value); // リクエストとは別にバリデーションを行うため、バリデーションも再設定する $this->validator = \Illuminate\Support\Facades\Validator::make( array_merge($this->all(), [$key => $value]), $this->rules() ); } // ここから通常のバリデーション定義 public function rules(): array { return [ 'name' => ['required', 'string'] ]; } public function attributes(): array { return [ 'name' => '名前' ]; } }
セッターを生やして、内部のリクエストやらバリデーションやらに改めてセットしています。実際に使った例が次です。
Route::get('/test', function () { echo <<<HTML <form action="/test" method="post"> <input type="text" name="name"> <button type="submit">送信</button> </form> HTML; }); Route::post('/test', function (\App\Http\Requests\CanRewritePostRequest $request) { // POSTした内容をそのまま表示 dump('本来のリクエスト'); dump([ '$request->all()' => $request->all(), '$request->validated()' => $request->validated(), "\$request->post('name')" => $request->post('name'), '$request->name' => $request->name ]); // 単にプロパティにセットするだけではメソッドを介した呼び出し値が変わらない $request->name = '変更後の名前'; dump("\$request->name = '変更後の名前';"); dump([ '$request->all()' => $request->all(), '$request->validated()' => $request->validated(), "\$request->post('name')" => $request->post('name'), '$request->name' => $request->name ]); // 用意したセッターを使えばメソッドを介した呼び出しでも値が変わる $request->setPost('name', '変更後の名前'); dump("\$request->setPost('name', '変更後の名前');"); dump([ '$request->all()' => $request->all(), '$request->validated()' => $request->validated(), "\$request->post('name')" => $request->post('name'), '$request->name' => $request->name ]); });
そうそう必要にならないし、使わない方が安全な挙動(リクエストが参照された時、外部から与えられた入力そのものを参照できることを期待しているコードが多いです)ですがテストコードでリクエストオブジェクトを簡易に使いまわしたい時などに意外と便利です。