像这样将Request对象注入到控制器方法中是否有好处:
use Request;
class WidgetController
{
public function create(Request $request)
{
$name = $request->input('name');
}
}
相对于消除use语句和对象注入,而只需使用辅助函数即可:
class WidgetController
{
public function create()
{
$name = request('name');
}
}
答案 0 :(得分:3)
request
助手只是Request::input('name')
的快捷方式。 request helper
app('request')->input($key, $default);
应用是管理Laravel依赖注入的容器。它将解析与名称request
对应的依赖关系,名称Illuminate\Http\Request
是input
的实例,并在其上调用方法{{1}}传递要检索的键的名称。
确实没有什么区别,一个是另一个的捷径。
答案 1 :(得分:2)
使用注入的主要原因是由于测试。如果您使用request(),则由于request()会调用app('request'),因此您需要初始化Laravel应用。如果未初始化app('request'),则您的测试将生成错误。
使用注入时,会将Request对象传递给该方法。这意味着在测试期间,您可以创建自己的“虚拟”请求并将其传递给方法,而无需初始化app()。然后,您可以测试该方法,并且仅测试不具有任何其他方法的依赖关系的方法。
答案 2 :(得分:0)
首先,代码样式和可读性。第一个是更具可读性的方式。我想到的第二件事是,如果使用request()
帮助程序,则无法验证请求。
假设您的请求必须包含参数title
和body
。如果参数不存在,则永远不要到达该端点。使用helper()
无法做到这一点。同时,使用第一种方法,确实有一种方便的方法。
class StoreRequest extends FormRequest
{
public function rules()
{
return [
'title' => 'required',
'body' => 'sometimes'
];
}
}
而不仅仅是:
use StoreRequest;
class WidgetController
{
public function create(StoreRequest $request)
{
$name = $request->input('name');
}
}
答案 3 :(得分:0)
可能会迟到,但是有关使用request()助手的有用信息是您不需要将请求对象传递给业务逻辑类。
例如:
User.php
-----------------------------------------------
...
protected $helper;
public function __construct(FileHelper $helper) {
$this->helper = $helper
public function uploadFile() {
$file = $this->helper->insertFile();
}
...
-----------------------------------------------
FileHelper.php
-----------------------------------------------
...
public function insertFile() {
$file = request()->file('filename');
// ur code
}
...
-----------------------------------------------
请注意,由于请求帮助程序已全局注入到您的应用程序中,因此您无需将$ request传递给insertFile。