Laravel 中间件


中间件充当请求和响应之间的桥梁,它是一种过滤机制,本章向你解释 Laravel 中的中间件机制。

Laravel 包含一个中间件,用于验证应用程序的用户是否经过身份验证,如果用户通过身份验证,它会重定向到主页,否则它会重定向到登录页面。

可以通过执行以下命令来创建中间件:

php artisan make:middleware <middleware-name>

<middleware-name>替换为你的中间件的名称,你所创建的中间件可以在app/Http/Middleware目录下看到。

观察下面的例子来理解中间件机制:

步骤1: 现在让我们创建AgeMiddleware,需要执行以下命令:

php artisan make:middleware AgeMiddleware

步骤2:命令执行成功后,会得到如下输出:

AgeMiddleware

步骤3AgeMiddleware将在app/Http/Middleware创建,并将自动生成以下代码。

<?php

namespace App\Http\Middleware;
use Closure;

class AgeMiddleware {
    public function handle($request, Closure $next) {
        return $next($request);
    }
}

注册中间件


我们需要在使用之前注册每个中间件,Laravel 中有两种类型的中间件:

  • 全局中间件

  • 路由中间件

全局中间件将在应用程序的每个HTTP请求上运行,而路由中间件将被分配给一个特定的路由,中间件可以在app/Http/Kernel.php注册,这个文件包含两个属性$middleware$routeMiddleware$middleware属性用于注册全局中间件,$routeMiddleware属性用于注册路由中间件。

要注册全局中间件,需要在 $middleware 列出类。

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
];

要注册特定于路由的中间件,将键和值添加到 $routeMiddleware 。

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

我们在前面的例子中已经创建了AgeMiddleware,现在可以在路由特定的中间件属性中注册它,注册的代码如下所示。

以下是代码app/Http/Kernel.php

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];
  
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'Age' => \App\Http\Middleware\AgeMiddleware::class,
    ];
}

中间件参数


我们也可以用中间件传递参数。例如,如果你的应用程序有不同的角色,如用户、管理员、超级管理员等,你想根据角色来验证行动,这可以通过中间件传递参数来实现。我们创建的中间件包含以下函数,我们可以在$next参数后传递我们的自定义参数:

public function handle($request, Closure $next) {
    return $next($request);
}

步骤1: 通过执行以下命令创建RoleMiddleware:

php artisan make:middleware RoleMiddleware

步骤2: 执行成功后,会得到如下输出:

Middleware Parameters

步骤3: 在RoleMiddlewareatapp/Http/Middleware/RoleMiddleware.php)的handle方法中添加以下代码:

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
    public function handle($request, Closure $next, $role) {
        echo "Role: ".$role;
        return $next($request);
    }
}

步骤4: 在app/Http/Kernel.php文件中注册RoleMiddleware,在该文件中添加灰色的一行来注册RoleMiddleware:

RoleMiddleware

步骤5: 执行以下命令创建TestController

php artisan make:controller TestController --plain

步骤6: 成功执行上述步骤后,你将得到以下输出:

TestController

步骤7: 复制以下几行代码到app/Http/TestController.php文件:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
    public function index() {
        echo "<br>Test Controller.";
    }
}

步骤8: 在app/Http/routes.php文件中添加一下代码:

Route::get('role',[
    'middleware' => 'Role:editor',
    'uses' => 'TestController@index',
]);

步骤9: 访问以下网址,测试带参数的中间件:

http://localhost:8000/role

步骤10: 输出将如下图所示。

Role Editor

可终止中间件


可终止的中间件在响应被发送到浏览器后执行一些任务,这可以通过在中间件中创建一个带有终止(terminate)方法的中间件来实现,可终止的中间件应在全局中间件中注册,终止方法将接收两个参数$request$response,终止方法可以按照下面的代码创建。

步骤1: 通过执行以下命令创建TerminateMiddleware

php artisan make:middleware TerminateMiddleware

步骤2: 上述步骤将产生以下输出:

Terminable Middleware

步骤3: 在app/Http/Middleware/TerminateMiddleware.php新创建的TerminateMiddleware中添加以下代码:

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
    public function handle($request, Closure $next) {
        echo "Executing statements of handle method of TerminateMiddleware.";
        return $next($request);
    }
   
    public function terminate($request, $response) {
        echo "<br>Executing statements of terminate method of TerminateMiddleware.";
    }
}

步骤4: 在app/Http/Kernel.php文件中注册TerminateMiddleware,在该文件中添加灰色的行来注册TerminateMiddleware

TerminateMiddleware

步骤5: 执行以下命令创建ABCController

php artisan make:controller ABCController --plain

步骤6: URL 执行成功后,会得到如下输出:

ABCController

步骤7: 复制以下代码到app/Http/ABCController.php文件:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ABCController extends Controller {
    public function index() {
        echo "<br>ABC Controller.";
    }
}

步骤8: 在app/Http/routes.php文件中添加一下代码:

Route::get('terminate',[
    'middleware' => 'terminate',
    'uses' => 'ABCController@index',
]);

步骤9: 访问以下网址测试可终止中间件:

http://localhost:8000/terminate

步骤10: 输出将如下图所示:

ABC Controller