动态创建Laravel Request对象

问题描述 投票:24回答:4

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

有没有办法在另一个控制器的store方法中设置一个需要的Request对象?我已经追溯到Request继承并且来到Symfony的Request对象,它有一个request属性,实际上是一个ParameterBag,它包含一个方法add来为它添加带值的参数。

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

$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);

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

php request laravel-5.1
4个回答
41
投票

你可以使用replace()

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

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

dd($request->foo);

或者,为第二个控制器中发生的任何事情创建一个Job更有意义,并删除ShouldQueue接口以使其同步运行。

希望这可以帮助!


22
投票

使用$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请求中。


4
投票

要“避免重复代码”,您需要将常用功能抽象为专用类,为其提供正确的助记名称,在其周围编写一组单元测试,然后在单元测试控制器时在控制器中进行模拟。

但如果你还需要提出要求:

use Illuminate\Http\Request;

$request = new Request([
        'name'   => 'unit test',
        'number'  => 123,
    ]);

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

$request
            ->setContainer(app())
            ->setRedirector(app(\Illuminate\Routing\Redirector::class))
            ->validateResolved();

0
投票

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

Replace

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

merge function doc

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

add function

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

注意::在我们扩展请求的所有函数中,意味着前一个参数将保留在那里。你将添加自己的。你可以全部替换它们。

© www.soinside.com 2019 - 2024. All rights reserved.