48.

【Laravel】$requestの値を変更する方法

編集
この記事の要点
  • Laravel で $request の値を変更したい場合は merge() / replace()
  • $request->merge([...]): 既存値はそのまま、追加・上書き
  • $request->replace([...]): 全部置き換え
  • 個別: $request->headers->set(...)(ヘッダ)
  • ミドルウェアで前処理するのが推奨パターン

 

Request の値を変更する 3 つの方法

① merge() - 既存値はそのまま、追加・上書き

use Illuminate\Http\Request;

public function store(Request $request)
{
    // 元の入力に user_id を追加
    $request->merge([
        'user_id' => auth()->id(),
        'created_at' => now(),
    ]);

    // 既存キーがあれば上書きされる
    $request->merge(['status' => 'pending']);

    // この時点で $request->input('user_id') が取れる
    User::create($request->all());
}

② replace() - 全部置き換え

public function store(Request $request)
{
    // 元の入力を完全に上書き
    $request->replace([
        'name' => 'NewName',
        'email' => 'new@example.com',
    ]);
    // この時点で他のフィールドはすべて消える
}

③ 個別キーの設定

// 単一キーの追加・変更
$request->offsetSet('key', 'value');

// 配列アクセスで
$request['key'] = 'value';

// オブジェクトのように代入 (Laravel 8+)
$request->key = 'value';

Header の変更

// 追加・上書き
$request->headers->set('X-Custom-Header', 'value');

// 削除
$request->headers->remove('X-Custom-Header');

// 取得
$value = $request->header('X-Custom-Header');

Query Parameter の変更

// すべての query を取得
$queries = $request->query();

// 単一 query 変更
$request->query->set('page', 2);

// 全部置き換え
$request->query->replace(['page' => 1, 'limit' => 20]);

ミドルウェアで前処理する(推奨)

コントローラ内で $request を変更するより、ミドルウェアで前処理する方が責務分離できます:

// app/Http/Middleware/AddUserToRequest.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class AddUserToRequest
{
    public function handle(Request $request, Closure $next)
    {
        if (auth()->check()) {
            $request->merge([
                'user_id' => auth()->id(),
                'user_name' => auth()->user()->name,
            ]);
        }
        return $next($request);
    }
}
// app/Http/Kernel.php
protected $middlewareGroups = [
    'web' => [
        // 既存のミドルウェア...
        \App\Http\Middleware\AddUserToRequest::class,
    ],
];

// または特定ルートで
Route::post('/posts', [PostController::class, 'store'])
    ->middleware(AddUserToRequest::class);

FormRequest で前処理する

バリデーション前後で値を加工:

// app/Http/Requests/StorePostRequest.php
class StorePostRequest extends FormRequest
{
    // バリデーション前に値を加工
    protected function prepareForValidation()
    {
        $this->merge([
            'slug' => Str::slug($this->title),
            'user_id' => auth()->id(),
        ]);
    }

    public function rules()
    {
        return [
            'title' => 'required|max:100',
            'slug' => 'required|unique:posts,slug',
            'user_id' => 'required|exists:users,id',
        ];
    }

    // バリデーション通過後の加工
    protected function passedValidation()
    {
        $this->merge([
            'content_html' => Str::markdown($this->content),
        ]);
    }
}

注意点

1. all() / input() のキャッシュ

Laravel は $request->all() の結果を内部的にキャッシュすることがあります。merge 後は再取得:

$data = $request->all();
$request->merge(['foo' => 'bar']);
$data2 = $request->all();  // 再取得すると foo が含まれる

2. validated() は変更前の値を見る場合がある

public function rules() { return ['name' => 'required']; }

// バリデーション後に merge しても validated() には反映されない
$request->validate($rules);
$request->merge(['name' => 'New']);
$validated = $request->validated();  // 元の値のまま

// 反映したい場合は prepareForValidation で merge

3. JSON リクエストでは all() に注意

JSON ボディと query 両方ある場合の挙動を確認してください:

// POST /users?source=admin
// Body: {"name": "Alice"}

$request->all();         // ['source' => 'admin', 'name' => 'Alice']
$request->query();       // ['source' => 'admin']
$request->json()->all(); // ['name' => 'Alice']
$request->input('name'); // 'Alice' (両方から検索)

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)