动态创建Laravel Request对象

Ben*_*Ben 32 php request laravel-5.1

我正在一个控制器中处理数据,并希望将其进一步传递到另一个控制器,以避免重复的代码.

有没有办法在另一个控制器的store-method中设置一个需要的Request对象?我已经跟踪了Request继承并找到了Symfony的Request对象,该对象有一个request属性,实际上是一个ParameterBag包含add向其中添加值的参数的方法.

我尝试过以下但是我得到null了结果:

$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
Run Code Online (Sandbox Code Playgroud)

我在这个项目上使用Laravel 5.1.

Rwd*_*Rwd 46

你可以使用replace():

$request = new \Illuminate\Http\Request();

$request->replace(['foo' => 'bar']);

dd($request->foo);
Run Code Online (Sandbox Code Playgroud)

或者,Job在第二个控制器中创建一个正在发生的任何内容并删除该ShouldQueue接口以使其同步运行更有意义.

希望这可以帮助!

  • 你能告诉我如何将请求方法更改为“POST”吗? (2认同)

小智 23

创建请求对象与$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);
Run Code Online (Sandbox Code Playgroud)

顺便使用,$myRequest->query->add()您可以将数据添加到GET请求.

  • 这个很棒 (2认同)

Yev*_*yev 8

为了“避免重复代码”,您需要将通用功能抽象为专用类,为其指定适当的助记符名称,在其周围编写一组单元测试,然后在对控制器进行单元测试时在控制器中对其进行模拟。

但是,如果您仍然需要发出请求:

use Illuminate\Http\Request;

$request = new Request([
        'name'   => 'unit test',
        'number'  => 123,
    ]);
Run Code Online (Sandbox Code Playgroud)

如果您需要请求的全部功能,则需要添加一些额外的行

$request
            ->setContainer(app())
            ->setRedirector(app(\Illuminate\Routing\Redirector::class))
            ->validateResolved();
Run Code Online (Sandbox Code Playgroud)