📜  Laravel中间件(1)

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

Laravel中间件

Laravel中间件提供了一个方便的机制来过滤进入应用程序的HTTP请求。中间件是在请求到达路由处理程序之前或在响应过程中调用的一组操作。中间件通过路由或控制器方法自动调用。

创建中间件

你可以使用 Artisan 的 make:middleware 命令来创建一个新的中间件。

php artisan make:middleware CheckAge

这将在 app/Http/Middleware 目录中创建一个名为 CheckAge 的新中间件。中间件包含两个方法:handleterminate

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * 处理传入的请求。
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 18) {
            return redirect('home');
        }

        return $next($request);
    }

    /**
     * 处理传出的响应。
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        // 代码在响应发送到浏览器后运行
    }
}

中间件的 handle 方法接收 $request$next 两个参数,使用 $next($request) 语句将请求传递到应用程序的下一个中间件或路由处理程序。

注册中间件

要注册中间件,请先在 Laravel 应用程序的 app/Http/Kernel.php 文件中找到 $middleware 数组。

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\CheckAge::class,
];
全局中间件

全局中间件将在每个请求期间运行,可以在 $middleware 数组中注册全局中间件。

protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\CheckAge::class,
];
路由中间件

路由中间件可以在路由定义中指定,或者在控制器的构造函数中指定。要注册路由中间件,请将它们添加到 $routeMiddleware 数组中。

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'check.age' => \App\Http\Middleware\CheckAge::class,
];
路由中间件

在 Laravel 中使用路由中间件可以轻松地保护您的路由或执行许多以前需要使用不同的过滤器来执行的操作。

要在路由定义中使用中间件,请在 web.phpapi.php 中指定它。

Route::get('dashboard', function () {
    //
})->middleware('auth');

Route::get('admin', function () {
    //
})->middleware('auth:admin');

Route::get('profile', function () {
    //
})->middleware(['auth', 'https']);
控制器中的中间件

你可以使用构造函数在控制器中注册中间件。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Middleware\CheckAge;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 注册中间件。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(CheckAge::class);
    }

    /**
     * 处理传入的请求。
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        // 用户已达到年龄限制,继续请求。
    }
}

现在我们已经了解了 Laravel 中间件的基本知识,您可以在应用程序中使用它来实现您需要的过滤器、权限、访问控制列表等功能。