[英]Why use dependency injection for Request object vs request() helper in Laravel?
像这样将 Request 对象注入控制器方法有什么好处:
use Request;
class WidgetController
{
public function create(Request $request)
{
$name = $request->input('name');
}
}
与消除 use 语句和对象注入并简单地使用 helper 相比:
class WidgetController
{
public function create()
{
$name = request('name');
}
}
request
助手只是Request::input('name')
的快捷方式。 请求助手的代码定义如下请求助手
app('request')->input($key, $default);
该应用程序是管理 Laravel 依赖注入的容器。 它将解析与作为Illuminate\\Http\\Request
实例的名称request
相对应的依赖项,并在其上调用方法input
并传递您要检索的键的名称。
真的没有区别,一个是另一个的捷径。
使用注入的主要原因是因为测试。 如果你使用 request() 那么你需要初始化 Laravel 应用程序,因为 request() 调用 app('request')。 如果 app('request') 未初始化,则您的测试将生成错误。
当您使用注入时,您将请求对象传递给方法。 这意味着在测试期间,您可以创建自己的“虚拟”请求并将其传递给方法,而无需初始化 app()。 然后,您可以测试该方法,并且仅测试没有其他任何内容和依赖项的方法。
首先,代码样式和可读性。 第一个更具可读性。 我认为的第二件事是,如果您使用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');
}
}
可能会迟到,但有关使用 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,因为请求助手已全局注入您的应用程序中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.