php 动态创建Laravel请求对象

ui7jx7zq  于 2022-12-25  发布在  PHP
关注(0)|答案(6)|浏览(163)

我在一个控制器中处理数据,并希望将其进一步传递到另一个控制器中以避免重复代码。
是否有办法设置另一个控制器的store-方法中所需的Request对象?我已经追踪了Request继承,并找到了Symfony的Request对象,该对象具有request属性,实际上是ParameterBag,该属性包含add方法,用于向其添加带值的参数。
我尝试了以下方法,但得到的结果是null

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

我在用Laravel 5.1做这个项目。

ctehm74n

ctehm74n1#

您可以使用replace()

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

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

dd($request->foo);

或者,为第二个控制器中正在进行的任何操作创建一个Job,并删除ShouldQueue接口以使其同步运行,这样做会更有意义。

ecfsfe2w

ecfsfe2w2#

使用$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请求添加数据。

2ul0zpep

2ul0zpep3#

为了“避免重复代码”,您需要将公共功能抽象到一个专用类中,给予它一个适当的助记名,围绕它编写一组单元测试,然后在单元测试控制器时在控制器中模拟它。
但如果您仍需要提出请求:

use Illuminate\Http\Request;

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

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

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

hwazgwia4#

您可以克隆现有请求并使用新数据填充它:

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

ajsxfq5m5#

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

更换

替换函数文档
如果您在控制器中,则在函数的参数中传递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()));
}

注:在所有函数中我们都在扩展请求,这意味着以前的参数将保留在那里。您将添加自己的参数。您可以替换所有参数。

a5g8bdjr

a5g8bdjr6#

你必须改变
这个

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

$myRequest = new Request();
$myRequest->merge(['foo' => 'bar']);
echo $myRequest->input('foo');

相关问题