[英]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.