为什么在 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()
帮助程序,则无法验证请求。
假设您的请求必须包含参数 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(),那么您需要初始化 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,因为请求助手已全局注入到您的应用程序中。
像这样将 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()
帮助程序,则无法验证请求。
假设您的请求必须包含参数 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(),那么您需要初始化 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,因为请求助手已全局注入到您的应用程序中。