I'm handling data in one controller and want to pass it further into another controller to avoid duplicate code.
Is there a way to set up a Request object that is needed in the other controller's store
-method? I've traced down the Request inheritance and came to Symfony's Request object which has a request
property that is in fact a ParameterBag
that holds a method add
to add parameters with values to it.
I've tried the following but I'm getting null
as result:
$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
I'm on Laravel 5.1 for this project.
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();
您可以克隆现有请求并用新数据填充它:
$request = (clone request())->replace(['foo' => 'bar']);
You can add the request parameter on the fly using these methods.
If you are in controller then, pass Request object in paramter of the function like
function createUser(Illuminate\Http\Request $request){
$request->replace(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}
function createUser(Illuminate\Http\Request $request){
$request->merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"));
}
function createUser(Illuminate\Http\Request $request){
$request->request->add(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}
Note:: in all function we are extending the request, mean previous parameter will remain there. You will be adding your own. You can replace them all.
You have to change
this
$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
to
$myRequest = new Request();
$myRequest->merge(['foo' => 'bar']);
echo $myRequest->input('foo');
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.