- Laravel 教程
- Laravel - 首页
- Laravel - 概述
- Laravel - 安装
- Laravel - 应用结构
- Laravel - 配置
- Laravel - 路由
- Laravel - 中间件
- Laravel - 命名空间
- Laravel - 控制器
- Laravel - 请求
- Laravel - Cookie
- Laravel - 响应
- Laravel - 视图
- Laravel - Blade 模板
- Laravel - 重定向
- Laravel - 数据库操作
- Laravel - 错误与日志
- Laravel - 表单
- Laravel - 本地化
- Laravel - Session
- Laravel - 验证
- Laravel - 文件上传
- Laravel - 发送邮件
- Laravel - Ajax
- Laravel - 错误处理
- Laravel - 事件处理
- Laravel - Facades
- Laravel - Contracts
- Laravel - CSRF 保护
- Laravel - 身份验证
- Laravel - 授权
- Laravel - Artisan 命令行
- Laravel - 加密
- Laravel - 散列
- 理解发布流程
- Laravel - 客人用户权限
- Laravel - Artisan 命令
- Laravel - 分页自定义
- Laravel - Dump Server
- Laravel - Action URL
- Laravel 有用资源
- Laravel - 快速指南
- Laravel - 有用资源
- Laravel - 讨论
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** 文件的 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 以测试带参数的中间件
https://127.0.0.1:8000/role
**步骤 10** - 输出将如下图所示。
可终止中间件
可终止中间件在响应已发送到浏览器后执行某些任务。这可以通过在中间件中创建具有**terminate**方法的中间件来实现。可终止中间件应与全局中间件一起注册。terminate 方法将接收两个参数**$request**和**$response**。可终止方法可以像以下代码所示创建。
示例
**步骤 1** - 通过执行以下命令创建 **TerminateMiddleware**。
php artisan make:middleware TerminateMiddleware
**步骤 2** - 以上步骤将产生以下输出:
**步骤 3** - 将以下代码复制到新创建的 **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 以测试可终止中间件。
https://127.0.0.1:8000/terminate
**步骤 10** - 输出将如下图所示。