📜  Laravel控制器中间件(1)

📅  最后修改于: 2023-12-03 15:17:17.451000             🧑  作者: Mango

Laravel控制器中间件

在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);
多个中间件

你可以在控制器或路由上指定多个中间件。中间件会按照你指定它们的顺序被调用。例如,假设你有两个中间件类: FirstMiddlewareSecondMiddleware 。你在路由或控制器中指定的顺序如下:

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 属性中。这些中间件将会按照你定义它们的顺序调用。