Laravel中间件


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

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

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

php artisan make:middleware <middleware-name>

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

观察以下示例以了解中间件机制 -

第1步 - 让我们现在创建AgeMiddleware。 要创建它,我们需要执行以下命令 -

php artisan make:middleware AgeMiddleware

第2步 - 成功执行该命令后,您将收到以下输出 -

AgeMiddleware

第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。

RoleMiddleware

第5步 - 执行以下命令来创建 TestController -

php artisan make:controller TestController --plain

第6步 - 成功执行上述步骤后,您将收到以下输出 -

的TestController

第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。 **

TerminateMiddleware

第5步 - 执行以下命令创建 ABCController

php artisan make:controller ABCController --plain

第6步 - 成功执行URL后,您将收到以下输出 -

ABCController

第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步 - 输出将显示如下图所示。

ABC控制器