Laravel - 中间件
中间件充当请求和响应之间的桥梁。它是一种过滤机制。本章将向您介绍 Laravel 中的中间件机制。
Laravel 包含一个中间件,用于验证应用程序的用户是否经过身份验证。如果用户经过身份验证,则重定向到主页,否则,如果未通过身份验证,则重定向到登录页面。
可以通过执行以下命令 − 来创建中间件
php artisan make:middleware <middleware-name>
将 <middleware-name> 替换为您的中间件的名称。您创建的中间件可以在 app/Http/Middleware 目录中看到。
示例
观察以下示例以了解中间件机制 −
步骤 1 − 现在让我们创建 AgeMiddleware。要创建它,我们需要执行以下命令 −
php artisan make:middleware AgeMiddleware
步骤 2 − 成功执行命令后,您将收到以下输出 −
步骤 3 − AgeMiddleware 将在 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 −执行成功后,您将收到以下输出 −
步骤 3 − 在 app/Http/Middleware/RoleMiddleware.php 中新建的 RoleMiddleware 的 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。
步骤 5 − 执行以下命令创建 TestController −
php artisan make:controller TestController --plain
步骤 6 − 成功执行上述步骤后,您将收到以下输出 −
步骤 7 −将以下代码行复制到 app/Http/TestController.php 文件。
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 文件中添加以下代码行。
app/Http/routes.php
Route::get('role',[ 'middleware' => 'Role:editor', 'uses' => 'TestController@index', ]);
步骤 9 − 访问以下 URL 以使用参数测试中间件
http://localhost:8000/role
步骤 10 − 输出将如下图所示显示。
Terminable 中间件
Terminable 中间件在将响应发送到浏览器后执行某些任务。这可以通过在中间件中创建带有 terminate 方法的中间件来实现。Terminable 中间件应在全局中间件中注册。终止方法将接收两个参数 $request 和 $response。终止方法可以按照以下代码所示创建。
示例
步骤 1 − 通过执行以下命令创建 TerminateMiddleware。
php artisan make:middleware TerminateMiddleware
步骤 2 − 上述步骤将产生以下输出 −
步骤 3 −将以下代码复制到新创建的 TerminateMiddleware 中,路径为 app/Http/Middleware/TerminateMiddleware.php。
<?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。
步骤 5 − 执行以下命令,创建 ABCController。
php artisan make:controller ABCController --plain
步骤 6 −成功执行 URL 后,您将收到以下输出 −
步骤 7 − 将以下代码复制到 app/Http/ABCController.php 文件。
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 文件中添加以下代码行。
app/Http/routes.php
Route::get('terminate',[ 'middleware' => 'terminate', 'uses' => 'ABCController@index', ]);
步骤 9 − 访问以下 URL 测试 Terminable 中间件。
http://localhost:8000/terminate
步骤 10 − 输出将如下图所示。