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

whe*_*ker 5 php dependency-injection laravel laravel-5 laravel-5.6

像这样将 Request 对象注入控制器方法有什么好处:

use Request;

class WidgetController
{
  public function create(Request $request)
  {
    $name = $request->input('name');
  }
}
Run Code Online (Sandbox Code Playgroud)

与消除 use 语句和对象注入并简单地使用 helper 相比:

class WidgetController
{
  public function create()
  {
    $name = request('name');
  }
}
Run Code Online (Sandbox Code Playgroud)

Yve*_*ndo 7

助手request只是一个快捷方式Request::input('name')。请求助手的代码定义如下请求助手

app('request')->input($key, $default);
Run Code Online (Sandbox Code Playgroud)

该应用程序是管理 Laravel 依赖注入的容器。request它将解析与作为实例的名称相对应的依赖关系Illuminate\Http\Request,并调用传递input您要检索的键的名称的方法。

其实没有什么区别,一个是另一个的捷径。


Mar*_*tra 6

使用注入的主要原因是测试。如果您使用 request() 那么您需要初始化 Laravel 应用程序,因为 request() 调用 app('request')。如果 app('request') 未初始化,那么您的测试将生成错误。

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