Laravel - 中间件

  • 简述

    中间件充当请求和响应之间的桥梁。它是一种过滤机制。本章向您介绍 Laravel 中的中间件机制。
    Laravel 包含一个中间件,用于验证应用程序的用户是否经过身份验证。如果用户通过身份验证,则重定向到主页,否则,它重定向到登录页面。
    可以通过执行以下命令来创建中间件 -
    
    php artisan make:middleware <middleware-name>
    
    更换<middleware-name>与您的中间件的名称。您创建的中间件可以在以下位置查看app/Http/Middleware目录。

    例子

    观察以下示例以了解中间件机制 -
    步骤 1− 现在让我们创建 AgeMiddleware。要创建它,我们需要执行以下命令 -
    
    php artisan make:middleware AgeMiddleware
    
    步骤 2− 成功执行命令后,您将收到以下输出 -
    时代中间件
    步骤 3AgeMiddleware将创建于app/Http/Middleware。新创建的文件将包含已为您创建的以下代码。
    
    <?php
    namespace App\Http\Middleware;
    use Closure;
    class AgeMiddleware {
       public function handle($request, Closure $next) {
          return $next($request);
       }
    }
    
  • 注册中间件

    我们需要在使用每个中间件之前注册它。Laravel 中有两种类型的中间件。
    • 全局中间件
    • 路由中间件
    Global Middleware将在应用程序的每个 HTTP 请求上运行,而Route Middleware将被分配到特定的路线。中间件可以注册在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的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);
       }
    }
    
    步骤 4− 注册 RoleMiddlewareapp\Http\Kernel.php文件。在该文件中添加以灰色突出显示的行以注册 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 使用参数测试中间件
    
    http://localhost:8000/role
    
    步骤 10− 输出将如下图所示。
    角色编辑器
  • 可终止中间件

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

    例子

    步骤 1− 创建TerminateMiddleware通过执行以下命令。
    
    php artisan make:middleware TerminateMiddleware
    
    步骤 2− 上述步骤将产生以下输出 −
    可终止中间件
    步骤 3- 将以下代码复制到新创建的TerminateMiddlewareapp/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− 注册TerminateMiddlewareapp\Http\Kernel.php文件。在该文件中添加以灰色突出显示的行以注册 TerminateMiddleware。
    终止中间件
    步骤 5− 执行以下命令创建ABCController.
    
    php artisan make:controller ABCController --plain
    
    步骤 6− 成功执行 URL 后,您将收到以下输出 −
    ABC控制器
    步骤 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 来测试可终止中间件。
    
    http://localhost:8000/terminate
    
    步骤 10− 输出将如下图所示。
    ABC控制器