为什么在Laravel中将依赖注入用于Request对象vs request()帮助器?

时间:2018-09-23 22:39:54

标签: php laravel laravel-5 dependency-injection laravel-5.6

像这样将Request对象注入到控制器方法中是否有好处:

use Request;

class WidgetController
{
  public function create(Request $request)
  {
    $name = $request->input('name');
  }
}

相对于消除use语句和对象注入,而只需使用辅助函数即可:

class WidgetController
{
  public function create()
  {
    $name = request('name');
  }
}

4 个答案:

答案 0 :(得分:3)

request助手只是Request::input('name')的快捷方式。 request helper

定义了请求帮助程序的代码
app('request')->input($key, $default);

应用是管理Laravel依赖注入的容器。它将解析与名称request对应的依赖关系,名称Illuminate\Http\Requestinput的实例,并在其上调用方法{{1}}传递要检索的键的名称。

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

答案 1 :(得分:2)

使用注入的主要原因是由于测试。如果您使用request(),则由于request()会调用app('request'),因此您需要初始化Laravel应用。如果未初始化app('request'),则您的测试将生成错误。

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

答案 2 :(得分:0)

首先,代码样式和可读性。第一个是更具可读性的方式。我想到的第二件事是,如果使用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');
  }
}

答案 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。