搜索

查看: 3157|回复: 11

[PHP] Laravel中间件的使用详解

[复制链接]
发表于 2023-5-4 17:03:47 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:03:47 3157 11 看全部
目录
  • 一:创建中间件
  • 二:前置和后置中间件
  • 1:前置中间件
  • 2:后置中间件
  • 三:注册中间件
  • 1:注册全局中间件
  • 2:为路由分配中间件
  • 3:中间件组
  • 4:排序中间件
  • 5:中间件参数
  • 6:Terminable 中间件Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会将用户重定向到登录界面。但是,如果用户被认证,中间件将允许该请求进一步进入该应用,所有中间件都位于 app/Http/Middleware 目录下

    一:创建中间件
    使用 make:middleware 命令来创建新的中间件
    php artisan make:middleware CheckAge  #CheckAge表示的是中间件文件名称
    该命令将会在 app/Http/Middleware 目录内新建一个 CheckAge 类
    在这个中间件里,我们仅允许提供的参数 id 大于 200 的请求访问该路由。否则,我们会将用户重定向到 home
    id
    二:前置和后置中间件
    中间件是在请求之前或之后运行取决于中间件本身

    1:前置中间件

    2:后置中间件

    三:注册中间件
    1:注册全局中间件
    如果你想让中间件在你应用的每个 HTTP 请求期间运行,只需在 app/Http/Kernel.php 类中的 $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,
    ];

    2:为路由分配中间件
    如果想为指定的路由配置中间件,首先应该在 app/Http/Kernel.php 文件内为该中间件指定一个键。默认情况下,Kernel 类的 $routeMiddleware 属性包含 Laravel 内置的中间件条目。要加入自定义的,只需把它附加到列表后并为其分配一个自定义键即可
    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,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
    一旦在 Kernel 中定义了中间件,就可使用 middleware 方法将中间件分配给路由
    Route::get('admin/profile', function () {
        //
    })->middleware('auth');
    你还可以为路由分配多个中间件
    Route::get('/', function () {
        //
    })->middleware('first', 'second');
    分配中间件时,你还可以传递完整的类名
    use App\Http\Middleware\CheckAge;

    Route::get('admin/profile', function () {
        //
    })->middleware(CheckAge::class);

    3:中间件组
    有时你可能想用单一的键为几个中间件分组,使其更容易分配到路由。可以使用 Kernel 类的 $middlewareGroups 属性来实现
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
    可以使用与单个中间件相同的语法将中间件组分配给路由和控制器操作
    Route::get('/', function () {
        //
    })->middleware('web');
    Route::group(['middleware' => ['web']], function () {
        //
    });

    4:排序中间件
    很少情况下,你可能需要中间件以特定的顺序执行,但是当它们被分配到路由时,你无法控制它们的顺序。在这种情况下,可以使用 app/Http/Kernel.php 文件的 $middlewarePriority 属性指定中间件优先级
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Authenticate::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];

    5:中间件参数
    中间件也可以接受额外的参数。例如,如果应用需要在运行特定操作前验证经过身份认证的用户是否具备给定的「角色」,你可以新建一个 CheckRole 中间件,由它来接收「角色」名称作为附加参数。
    附加的中间件参数应该在 $next 参数之后被传递:
    user()->hasRole($role)) {
                // 重定向...
            }
            return $next($request);
        }
    }
    定义路由时通过一个 : 来隔开中间件名称和参数来指定中间件参数。多个参数就使用逗号分隔
    Route::put('post/{id}', function ($id) {
        //
    })->middleware('role:editor');

    6:Terminable 中间件
    laravel 内置的「session」中间件会在响应发送到浏览器之后将会话数据写入存储器中。如果你在中间件中定义一个 terminate 方法,则会在响应发送到浏览器后自动调用

    terminate 方法应该同时接收和响应。一旦定义了这个中间件,你应该将它添加到路由列表或 app/Http/Kernel.php 文件的全局中间件中
    在你的中间件上调用 terminate 调用时,Laravel 会从 服务容器 中解析出一个新的中间件实例。如果要在调用 handle 和 terminate 方法时使用同一个中间件实例,就使用容器的 singleton 方法向容器注册中间件
    到此这篇关于Laravel中间件的使用详解的文章就介绍到这了,更多相关Laravel中间件内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛!
  • 发表于 2023-6-28 20:33:22 | 显示全部楼层
    李志敏 2023-6-28 20:33:22 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    发表于 2023-6-28 22:04:32 | 显示全部楼层
    123456865 2023-6-28 22:04:32 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-29 08:29:30 | 显示全部楼层
    塞翁364 2023-6-29 08:29:30 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-29 11:50:04 | 显示全部楼层
    123456823 2023-6-29 11:50:04 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    发表于 2023-6-29 14:09:51 | 显示全部楼层
    永远就三年疗 2023-6-29 14:09:51 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    发表于 2023-6-29 19:19:19 | 显示全部楼层
    麻辣鸡翅 2023-6-29 19:19:19 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-29 20:23:58 | 显示全部楼层
    我的苦恼冉 2023-6-29 20:23:58 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-29 21:42:47 | 显示全部楼层
    井底燕雀傥 2023-6-29 21:42:47 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-29 23:46:23 | 显示全部楼层
    ffycxyw2274436 2023-6-29 23:46:23 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    • 您可能感兴趣
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| 小黑屋| 知鸟论坛 |网站地图
    本站资源来自互联网用户收集发布,如有侵权请邮件联系处理。 联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表