我正在一个控制器中处理数据,并希望将其进一步传递到另一个控制器,以避免重复的代码。
有没有办法在另一个控制器的store
方法中设置一个需要的Request对象?我已经追溯到Request继承并且来到Symfony的Request对象,它有一个request
属性,实际上是一个ParameterBag
,它包含一个方法add
来为它添加带值的参数。
我试过以下但是我得到了null
的结果:
$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
我在这个项目上使用Laravel 5.1。
你可以使用replace()
:
$request = new \Illuminate\Http\Request();
$request->replace(['foo' => 'bar']);
dd($request->foo);
或者,为第二个控制器中发生的任何事情创建一个Job
更有意义,并删除ShouldQueue
接口以使其同步运行。
希望这可以帮助!
使用$myRequest = new Request();
创建请求对象会使用method = 'GET'
创建对象。您可以使用$myRequest->getMethod()
检查您的请求方法。由于request
属性包含POST请求的数据,因此默认情况下不能使用$myRequest->request->add()
。首先,您必须将请求的方法设置为POST:
$myRequest = new \Illuminate\Http\Request();
$myRequest->setMethod('POST');
$myRequest->request->add(['foo' => 'bar']);
dd($request->foo);
顺便说一下,使用$myRequest->query->add()
可以将数据添加到GET请求中。
要“避免重复代码”,您需要将常用功能抽象为专用类,为其提供正确的助记名称,在其周围编写一组单元测试,然后在单元测试控制器时在控制器中进行模拟。
但如果你还需要提出要求:
use Illuminate\Http\Request;
$request = new Request([
'name' => 'unit test',
'number' => 123,
]);
如果您需要Request的全部功能,则需要添加一些额外的行
$request
->setContainer(app())
->setRedirector(app(\Illuminate\Routing\Redirector::class))
->validateResolved();
您可以使用这些方法动态添加请求参数。
如果你在控制器中,那么在函数的参数中传递Request对象
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()));
}
注意::在我们扩展请求的所有函数中,意味着前一个参数将保留在那里。你将添加自己的。你可以全部替换它们。