laravel - 在控制器的构造函数中指定中间件
问题描述
这是来自 laravel 内置 RegisterController 的代码片段。
public function __construct(){
$this->middleware('guest'); //What does it actually do?
}
- 我知道
middleware
在控制器构造函数中定义是一个好习惯,但我需要知道$this->middleware('guest')
它实际做了什么以及它设置了什么参数(在哪里?)。 - 第二个问题:在同一个控制器(
RegisterController
)中,我们use RegisterUser
(在命名空间中定义Illuminate\Foundation\Auth
)但似乎我们从未在整个控制器中使用它(覆盖方法或属性)。我有点困惑。提前感谢!
类 RegisterController 扩展控制器 {
use RegistersUsers; //?????
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}
解决方案
1)$this->middleware(...)
在控制器的构造函数中调用只是将任何值添加到控制器上...
命名的数组middleware
中。那时就是这样。在那一点上没有什么是“跑”的。您可以在您的控制器扩展的控制器中看到此功能,Illuminate\Routing\Controller
.
稍后,当路由器需要分派请求时,它将构建一个中间件堆栈以通过收集中间件来传递请求,其中包括向控制器实例询问其定义的middleware
via getMiddleware
。
public function getMiddleware()
{
return $this->middleware;
}
2) 特征是将功能和变量包含在您的控制器中。在控制器上有一些指向这些方法的路由。
你可以把所有的代码粘贴到你的控制器中,基本上是一样的。
如果您需要更改该控制器的任何功能或对其进行自定义,您最终将重新定义其中一些方法或调整变量。
推荐阅读
- unit-testing - 在 Jest 测试中模拟所需的类而不实际导入它
- c# - 动态 Linq FirstOrDefault 语句
- discord - 每次我要进行更新时,如何让我的机器人发送一条消息,以便我的客户知道?(discord.js)
- docker - 关于使用 docker-compose 构建 RocketMQ 集群的一些问题
- ios - 非标称类型 'T' 不支持显式初始化 Codable
- openssl - 将 OpenSSL FIPS 兼容 (libcrypto.a) 与另一个静态库链接
- asp.net-mvc - Mvc View 和 HttpPost 有不同的文化值
- javascript - 为什么我的 Google Analytics(分析)调用事件跟踪代码未跟踪?
- jquery - 使用 ajax 调用过滤数据时更新标记
- ssl - 嵌入式 Tomcat - 无需重新启动即可更新/删除证书