在控制器和路由中分配相同的中间件



我是Laravel和PHP的新手,最近正在阅读一篇教程。首先,他们在app/Http/Controllers/AuthController.php 中声明了auth:api中间件

public function __construct() {
$this->middleware('auth:api', ['except' => ['login', 'register']]);
}

后来他们在routes/ai.php 中又做了一次

Route::group([
'middleware' => 'api',
'prefix' => 'auth'], function ($router) {
Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);
...
});

我删除了Route::group语句,并将路由从中取出

Route::post('/login', [AuthController::class, 'login']);
Route::post('/register', [AuthController::class, 'register']);
...

它仍然有效。

所以我的问题是:

  1. 'middleware' => 'api'中的api来自哪里?它和auth:api是一回事吗?但我在Kernel.php中检查了$routeMiddleware,它没有密钥api

  2. loginregister不应该使用任何中间件,但它们包含在路由组中,我可以很好地注册和登录。为什么?难道它不应该因为我没有代币而拒绝我吗?

  3. 如果我只想在api.php中声明中间件,那么中间件的名称应该是什么?只是api可以吗?

我同意这可能会让人感到困惑。

  1. 'middleware' => 'api'指的是位于Kernel.php中稍靠下的$middlewareGroups数组条目
'api' => [
'throttle:240,1',
'bindings',
],

它与身份验证保护auth:api不同,请参阅此处。

  1. 但是,您可能仍然应该在loginregister路由上安装这些中间件,以节流并执行路由模型绑定。

  2. 您可以使用任何适合您的身份验证机制的中间件。对于Passport,这是auth:api,我认为它是用于Sanctum的auth:sanctum,如果您使用内置的,我认为是web。你可以随心所欲地命名这些;它们在CCD_ 20中被定义。

最新更新