目录

Laravel - 中间件( Middleware)

中间件充当请求和响应之间的桥梁。 它是一种过滤机制。 本章将向您介绍Laravel中的中间件机制。

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

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

php artisan make:middleware <middleware-name>

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

例子 (Example)

请注意以下示例以了解中间件机制 -

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

php artisan make:middleware AgeMiddleware

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

AgeMiddleware

Step 3 - 将在app/Http/Middleware创建AgeMiddleware 。 新创建的文件将为您创建以下代码。

<?php
namespace App\Http\Middleware;
use Closure;
class AgeMiddleware {
   public function handle($request, Closure $next) {
      return $next($request);
   }
}

注册中间件

我们需要在使用它之前注册每个中间件。 Laravel中有两种类型的中间件。

  • Global Middleware
  • 路由中间件

Global Middleware将在应用程序的每个HTTP请求上运行,而Route Middleware将分配给特定路由。 中间件可以在app/Http/Kernel.php. 此文件包含两个属性$middleware$routeMiddleware$middleware属性用于注册Global 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,
];

例子 (Example)

我们在前面的例子中创建了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);
}

例子 (Example)

Step 1 - 执行以下命令创建RoleMiddleware -

php artisan make:middleware RoleMiddleware

Step 2 - 成功执行后,您将收到以下输出 -

中间件参数

Step 3 - 在新创建的RoleMiddlewareat app/Http/Middleware/RoleMiddleware.php.的handle方法中添加以下代码app/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);
   }
}

Step 4 - 在app\Http\Kernel.php文件中注册app\Http\Kernel.php 。 在该文件中添加以灰色突出显示的行以注册RoleMiddleware。

RoleMiddleware

Step 5 - 执行以下命令以创建TestController -

php artisan make:controller TestController --plain

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

的TestController

Step 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.";
   }
}

Step 8 - 在app/Http/routes.php文件中添加以下代码行。

app/Http/routes.php

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

Step 9 - 访问以下URL以使用参数测试中间件

http://localhost:8000/role

Step 10 - 输出将如下图所示。

角色编辑器

可终止的中间件

响应发送到浏览器后,可终止的中间件执行某些任务。 这可以通过在中间件中创建具有terminate方法的中间件来实现。 可终止的中间件应该在全局中间件中注册。 terminate方法将接收两个参数$request$response. 可以创建Terminate方法,如以下代码所示。

例子 (Example)

Step 1 - 通过执行以下命令创建TerminateMiddleware

php artisan make:middleware TerminateMiddleware

Step 2 - 上述步骤将产生以下输出 -

可终止的中间件

Step 3 - 在app/Http/Middleware/TerminateMiddleware.php.新创建的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.";
   }
}

Step 4 - 在app\Http\Kernel.php文件中注册TerminateMiddleware 。 在该文件中添加以灰色突出显示的行以注册TerminateMiddleware。

TerminateMiddleware

Step 5 - 执行以下命令以创建ABCController

php artisan make:controller ABCController --plain

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

ABCController

Step 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.";
   }
}

Step 8 - 在app/Http/routes.php文件中添加以下代码行。

app/Http/routes.php

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'ABCController@index',
]);

Step 9 - 访问以下URL以测试可终结中间件。

http://localhost:8000/terminate

Step 10 - 输出将如下图所示。

ABC控制器
↑回到顶部↑
WIKI教程 @2018