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