即时创建 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 请求添加数据。

您可以使用这些方法即时添加请求参数。

替换

replace function doc

如果您在控制器中,则在函数的参数中传递 Request 对象,例如

  function createUser(Illuminate\Http\Request $request){
     $request->replace(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}

合并功能

merge function doc

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']);