簡體   English   中英

為什么在 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')的快捷方式。 請求助手的代碼定義如下請求助手

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

該應用程序是管理 Laravel 依賴注入的容器。 它將解析與作為Illuminate\\Http\\Request實例的名稱request相對應的依賴項,並在其上調用方法input並傳遞您要檢索的鍵的名稱。

真的沒有區別,一個是另一個的捷徑。

使用注入的主要原因是因為測試。 如果你使用 request() 那么你需要初始化 Laravel 應用程序,因為 request() 調用 app('request')。 如果 app('request') 未初始化,則您的測試將生成錯誤。

當您使用注入時,您將請求對象傳遞給方法。 這意味着在測試期間,您可以創建自己的“虛擬”請求並將其傳遞給方法,而無需初始化 app()。 然后,您可以測試該方法,並且僅測試沒有其他任何內容和依賴項的方法。

首先,代碼樣式和可讀性。 第一個更具可讀性。 我認為的第二件事是,如果您使用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() 助手的有用信息是您不需要將請求對象傳遞給您的業務邏輯類。

例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM