Create a Laravel Request object on the fly Create a Laravel Request object on the fly php php

Create a Laravel Request object on the fly


You can use replace():

$request = new \Illuminate\Http\Request();$request->replace(['foo' => 'bar']);dd($request->foo);

Alternatively, it would make more sense to create a Job for whatever is going on in your second controller and remove the ShouldQueue interface to make it run synchronously.

Hope this helps!


Creating a request object with $myRequest = new Request(); creates the object with method = 'GET'. You can check your request's method with $myRequest->getMethod().As the request property holds data for POST requests you cannot use $myRequest->request->add() by default. First you have to set the request's method to POST:

$myRequest = new \Illuminate\Http\Request();$myRequest->setMethod('POST');$myRequest->request->add(['foo' => 'bar']);dd($request->foo);

By the way using $myRequest->query->add() you can add data to a GET request.


To "avoid duplicate code" you need to abstract the common functionality into a dedicated class, give it a proper mnemonic name, write a set of unit tests around it, and then mock it in controllers when unittesting controllers.

but if you still need to make requests:

use Illuminate\Http\Request;$request = new Request([        'name'   => 'unit test',        'number' => 123,    ]);

and if you need the full functionality of the Request, you need to add some extra lines

$request    ->setContainer(app())    ->setRedirector(app(\Illuminate\Routing\Redirector::class))    ->validateResolved();