在 Laravel 中动态创建请求对象

78

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

是否有一种方法可以设置一个请求对象,该对象需要在另一个控制器的 store 方法中使用?我已经追踪了请求继承,并找到了Symfony的请求对象,它具有一个名为 request 的属性,实际上是一个 ParameterBag,它包含一个方法 add,用于向其中添加具有值的参数。

我尝试了以下方法,但结果却是null:

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

我在这个项目中使用的是Laravel 5.1。


1
为了“避免重复代码”,您需要将常见功能抽象成一个专用类,给它一个适当的助记符名称,编写一组单元测试,并在控制器中进行模拟,以便在对控制器进行单元测试时使用。 - Yevgeniy Afanasyev
6个回答

99
你可以使用replace()方法:
$request = new \Illuminate\Http\Request();

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

dd($request->foo);

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


谢谢,由于时间限制,我使用了一些重复的代码来解决它(也有其他事情需要在外部控制器中发生)。我会记住这个方法的! - Ben Fransen
2
你能告诉我如何将请求方法更改为“POST”吗? - Rahul Sharma

51

使用$myRequest = new Request();创建请求对象时,默认情况下将创建方法为'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请求中添加数据。


2
这个很棒。 - Mohammed Omer

42
为了“避免重复代码”,您需要将公共功能抽象成一个专门的类,为其命名一个恰当的助记符名称,编写一组围绕它的单元测试,然后在控制器中进行模拟,以在对控制器进行单元测试时使用。
但是,如果您仍然需要发出请求:
use Illuminate\Http\Request;

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

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

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

2
您可以克隆现有的请求并填充新数据:
$request = (clone request())->replace(['foo' => 'bar']);

1

您需要更改

这个

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

to

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

1
你可以使用以下方法动态添加请求参数。

替换

替换函数文档

如果你在控制器中,可以将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()));
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接