为什么在 Laravel 中对 Request 对象和 request() 助手使用依赖注入?

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') 的快捷方式。请求助手的代码定义如下 request helper

app('request')->input($key, $default);

该应用程序是管理 Laravel 的依赖注入的容器。它将解析对应于名称 request 的依赖项,它是 Illuminate\Http\Request 的一个实例,并调用它的方法 input 传递您要检索的密钥的名称。

真的没有区别,一个是另一个的捷径

首先,代码样式和可读性。第一个更具可读性。我想到的第二件事是,如果您使用 request() 帮助程序,则无法验证请求。

假设您的请求必须包含参数 titlebody。如果参数不存在,它永远不会到达那个端点。使用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(),那么您需要初始化 Laravel 应用程序,因为 request() 调用 app('request')。如果 app('request') 未初始化,那么您的测试将产生错误。

当您使用注入时,您将 Request 对象传递给该方法。这意味着在测试期间,您可以创建自己的 "dummy" 请求并将其传递给方法,而无需初始化 app()。然后你可以测试这个方法,并且只测试这个方法而不依赖于其他任何东西。

可能会迟到,但有关使用 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,因为请求助手已全局注入到您的应用程序中。