📅  最后修改于: 2023-12-03 15:17:17.451000             🧑  作者: Mango
在Laravel框架中,控制器中间件是一种可重用的代码。中间件能够过滤进入控制器的HTTP请求并向控制器提供额外的功能。例如,你可以使用中间件来验证请求的来源,授权访问等。
要创建一个控制器中间件,可以运行以下命令:
php artisan make:middleware MyMiddleware
该命令将在 app/Http/Middleware
目录下创建一个名为 MyMiddleware
的新中间件类。
中间件类的基本骨架如下所示:
<?php
namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
public function handle($request, Closure $next)
{
// Handle the request...
return $next($request);
}
}
中间件需要实现一个 handle
方法,该方法接收请求实例并且必须返回一个响应实例或者调用 $next
函数来继续操作到达控制器。
要为一个控制器指定中间件,可以使用 middleware
方法。例如,我们要将 MyMiddleware
中间件指定为该控制器的一个中间件,可以在 __construct
方法中调用该方法:
class MyController extends Controller
{
public function __construct()
{
$this->middleware(MyMiddleware::class);
}
}
你可以通过路由或控制器指定中间件。要为路由指定中间件,可以使用 middleware
方法。例如:
Route::get('admin/profile', function () {
//
})->middleware(MyMiddleware::class);
你可以在控制器或路由上指定多个中间件。中间件会按照你指定它们的顺序被调用。例如,假设你有两个中间件类: FirstMiddleware
和 SecondMiddleware
。你在路由或控制器中指定的顺序如下:
Route::get('user', 'UserController@index')->middleware(FirstMiddleware::class, SecondMiddleware::class);
当请求到达这个路由时,FirstMiddleware
中间件会先被调用,然后是 SecondMiddleware
中间件,最后才会调用控制器方法。
你可以为你的中间件指定参数。参数可以通过 ,
分割。你可以通过路由和控制器指定参数和中间件类的名字。例如,假设你的中间件接收一个 $role
参数:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
要为中间件指定一个参数,可以将参数跟在中间件名字后面,使用 :
分割。例如,要为 CheckRole
中间件指定 admin
参数:
Route::get('admin/profile', function () {
//
})->middleware(CheckRole::class . ':admin');
有时只需要将更多参数传递给你的中间件。你可以在传递中间件名称时传递整个参数数组:
Route::put('post/{id}', function ($id) {
//
})->middleware(CheckRole::class . ':first', CheckRole::class . ':second');
有时你可能希望将中间件应用到你所有的 HTTP 请求中。你可以将这些中间件添加到 app/Http/Kernel.php
文件的 $middleware
属性中。这些中间件将会按照你定义它们的顺序调用。