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步 - 在新创建的RoleMiddlewareat 应用/ Http / Middleware / RoleMiddleware.php 的句柄方法中添加以下代码 。
<?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 文件中。
应用程序/ 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 文件中添加以下代码行。
应用程序/ HTTP / routes.php文件
Route::get('role',[ 'middleware' => 'Role:editor', 'uses' => 'TestController@index', ]);
第9步 - 访问以下URL以使用参数测试中间件
http://localhost:8000/role
第10步 - 输出将显示如下图所示。
可终止的中间件
响应已发送到浏览器后,终止中间件执行一些任务。这可以通过在中间件中使用 terminate 方法创建中间件来完成。终止中间件应该注册到全局中间件。terminate方法将接收两个参数 $ request 和 $ response。 可以按照以下代码中所示创建终止方法。
例
第1步 - 通过执行以下命令创建 TerminateMiddleware 。
php artisan make:middleware TerminateMiddleware
第2步 - 上述步骤将产生以下输出 -
第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。 **
第5步 - 执行以下命令创建 ABCController 。
php artisan make:controller ABCController --plain
第6步 - 成功执行URL后,您将收到以下输出 -
第7步 - 将以下代码复制到 app / Http / ABCController.php 文件。
应用程序/ 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 文件中添加以下代码行。
应用程序/ HTTP / routes.php文件
Route::get('terminate',[ 'middleware' => 'terminate', 'uses' => 'ABCController@index', ]);
第9步 - 访问以下URL以测试可终止的中间件。
http://localhost:8000/terminate
第10步 - 输出将显示如下图所示。
命名空间用于各种编程语言,以创建一组独立的变量,函数和类。程序可能包含各种功能,这可能会导致与现有功能发生冲突。命名空间在避免这种冲突方面起着关键作用。本章将为您提供有关Laravel中名称空间及其用法的详细知识。 ...