货物

Laravel 中间件是如何工作的

Laravel 中间件是介于用户请求和应用程序响应之间的中间应用层。

这意味着当用户(Laravel 视图)向服务器(Laravel 控制器)发出请求时,请求将通过中间件。 这样中间件可以检查请求是否经过身份验证: 

  • 如果用户的请求通过验证,则将请求发送到后端;
  • 如果用户的请求未经身份验证,中间件会将用户重定向到登录屏幕。

Laravel 允许你 defi完成并使用附加中间件来执行除身份验证之外的各种任务。 

Laravel 中间件,例如身份验证和 CSRF 保护,位于目录中 应用程序/HTTP/中间件 .

因此我们可以说中间件是一个 http 请求过滤器,通过它可以验证条件并执行操作。

创建中间件

要创建一个新的中间件,我们运行以下命令:

php artisan make:middleware <name-of-middleware>

我们创造了 middleware 我们称之为 CheckAge, artisan 会回答我们如下:

上面的窗口显示中间件已成功创建,名称为“ 检查年龄 “。

查看CheckAge中间件是否创建,进入app/Http/Middleware文件夹下的项目,会看到新建的文件

新建的文件有如下代码

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

使用中间件

要使用中间件,我们需要注册它。

Laravel 中有两种类型的中间件:

  • Middleware globale
  • Route Middleware

Il 全局中间件 将在来自应用程序的每个 HTTP 请求上执行,而 路由中间件 将被分配到一个特定的路径。 中间件可以注册在 应用程序/Http/Kernel.php。 该文件包含两个属性 $中间件 e $路由中间件 . $中间件属性 用于注册全局中间件和所有权 $路由中间件 用于注册特定于路由的中间件。

要注册全局中间件,请在 $middleware 属性的末尾列出类。

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

要注册特定于路由的中间件,请将键和值添加到 $routeMiddleware 属性。

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

我们创造了 检查年龄 在前面的例子中。 我们现在可以在中间件路由属性中注册它。 此类注册的代码如下所示。

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
    ];

中间件参数

我们也可以用中间件传递参数。 

例如,如果您的应用程序具有不同的角色,如用户、管理员、超级管理员等。 并且您想根据角色对操作进行身份验证,可以通过使用中间件传递参数来实现。 

我们创建的中间件包含以下函数,我们可以在参数后传递自定义参数 $下一步 .

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

现在让我们尝试将角色参数设置为我们要从头开始创建的新中间件,然后通过运行以下命令继续创建角色中间件

修改handle方法如下

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

我们添加了参数 $role, 以及方法内部的行 echo 写入输出角色的名称。

创新通讯
不要错过有关创新的最重要新闻。 注册以通过电子邮件接收它们。

现在让我们为特定路径注册 RoleMiddleware 中间件

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

现在要使用参数测试中间件,我们需要创建一个请求和一个响应。 为了模拟响应,让我们创建我们将调用 TestController 的控制器

php artisan make:controller TestController --plain

刚刚执行的命令将在文件夹中创建一个新的控制器 app/Http/TestController.php, 并改变方法 index 用线 echo "<br>Test Controller.";

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

设置响应后,我们通过编辑文件来构建请求 routes.php通过添加 route role

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

此时我们可以通过访问 URL 来尝试示例 http://localhost:8000/role

在浏览器中我们会看到这两个 echo

Role editor
Test Controller

可终止中间件

Il terminable Middleware 在响应发送到浏览器后执行一些任务。 这可以通过使用方法创建中间件来实现 终止于中间件。 Il terminable Middleware 必须注册 middleware 全球的。 方法 terminate 将收到两个参数 $ request e $响应。 

该方法 Terminate 必须按以下代码所示创建。

php artisan make:middleware 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.";
   }
}

在这种情况下,我们有一个方法 handle 和一个方法 terminate 有两个参数 $request e $response.

现在让我们注册中间件

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'Age' => \App\Http\Middleware\CheckAge::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
        'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
    ];

现在我们需要创建控制器来模拟响应

php artisan make:controller XYZController --plain

修改类的内容

class XYZController extends Controller {
   public function index() {
      echo "<br>XYZ Controller.";
   }
}

现在我们需要编辑文件 routes/web.php 添加激活请求所需的路由

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

此时我们可以通过访问 URL 来尝试示例 http://localhost:8000/terminate

在浏览器中我们将看到以下几行

Executing statements of handle method of TerminateMiddleware
XYZController
Executing statements of terminate method of TerminateMiddleware

Ercole Palmeri

您还可能感兴趣的:

创新通讯
不要错过有关创新的最重要新闻。 注册以通过电子邮件接收它们。

Articoli最新回应

卡塔尼亚综合诊所的 Apple 观众对增强现实进行创新干预

卡塔尼亚综合诊所使用 Apple Vision Pro 商业查看器进行了眼部整形手术……

3 2024五月

儿童涂色页的好处 - 适合所有年龄段的魔法世界

通过着色培养精细运动技能可以帮助孩子们为写作等更复杂的技能做好准备。填色…

2 2024五月

未来已来:航运业如何彻底改变全球经济

海军部门是真正的全球经济力量,已迈向 150 亿美元的市场……

1 2024五月

出版商和 OpenAI 签署协议以规范人工智能处理的信息流

上周一,英国《金融时报》宣布与 OpenAI 达成协议。英国《金融时报》授予其世界级新闻报道许可……

四月30 2024