即时创建 Laravel 请求对象
Create a Laravel Request object on the fly
我正在一个控制器中处理数据,并希望将其进一步传递到另一个控制器中以避免重复代码。
有没有办法设置另一个控制器的 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 请求添加数据。
您可以使用这些方法即时添加请求参数。
替换
如果您在控制器中,则在函数的参数中传递 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()));
}
注意::在我们扩展请求的所有功能中,意味着以前的参数将保留在那里。您将添加自己的。你可以全部替换。
为了“避免重复代码”,你需要将通用功能抽象成一个专用的class,给它一个合适的助记名称,围绕它编写一组单元测试,然后在控制器中模拟它单元测试控制器。
但如果您还需要提出请求:
use Illuminate\Http\Request;
$request = new Request([
'name' => 'unit test',
'number' => 123,
]);
如果您需要请求的全部功能,则需要添加一些额外的行
$request
->setContainer(app())
->setRedirector(app(\Illuminate\Routing\Redirector::class))
->validateResolved();
您可以克隆现有请求并用新数据填充它:
$request = (clone request())->replace(['foo' => 'bar']);
我正在一个控制器中处理数据,并希望将其进一步传递到另一个控制器中以避免重复代码。
有没有办法设置另一个控制器的 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 请求添加数据。
您可以使用这些方法即时添加请求参数。
替换
如果您在控制器中,则在函数的参数中传递 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()));
}
注意::在我们扩展请求的所有功能中,意味着以前的参数将保留在那里。您将添加自己的。你可以全部替换。
为了“避免重复代码”,你需要将通用功能抽象成一个专用的class,给它一个合适的助记名称,围绕它编写一组单元测试,然后在控制器中模拟它单元测试控制器。
但如果您还需要提出请求:
use Illuminate\Http\Request;
$request = new Request([
'name' => 'unit test',
'number' => 123,
]);
如果您需要请求的全部功能,则需要添加一些额外的行
$request
->setContainer(app())
->setRedirector(app(\Illuminate\Routing\Redirector::class))
->validateResolved();
您可以克隆现有请求并用新数据填充它:
$request = (clone request())->replace(['foo' => 'bar']);