简介

HTTP 中间件提供了为过滤进入应用的 HTTP 请求提供了一套便利的机制。例如,Laravel 内置了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就会允许请求继续往前进入下一步操作。

当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。

Laravel框架自带了一些中间件,包括维护模式、认证、CSRF 保护中间件等等。所有的中间件都位于 app/Http/Middleware 目录。

定义中间件

要创建一个新的中间件,可以通过 Artisan 命令 make:middleware:

php artisan make:middleware Test

这个命令会在 app/Http/Middleware 目录下创建一个新的中间件类 Test

<?php

namespace AppHttpMiddleware;

use Closure;

class Test

{

/**

* Handle an incoming request.

*

* @param IlluminateHttpRequest $request

* @param Closure $next

* @return mixed

*/

public function handle($request, Closure $next)

{

return $next($request);

}

}

程序执行前调用的方法

public function handle($request, Closure $next, $guard = null)

{

// 执行动作

if(!$request->session()->has('user')){

return redirect("login");

}

return $next($request);

}

程序执行后调用的方法

public function handle($request, Closure $next)

{

$response = $next($request);

// 执行动作

if(!$request->session()->has('huser')){

return redirect("login/index");

}

return $response;

}

全局中间件

如果你想要中间件在每一个 HTTP 请求期间被执行,只需要将相应的中间件类设置到 app/Http/Kernel.php 的数组属性 $middleware 中即可。

/**

* The application's global HTTP middleware stack.

*

* These middleware are run during every request to your application.

*

* @var array

*/

protected $middleware = [

IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,

IlluminateFoundationHttpMiddlewareValidatePostSize::class,

AppHttpMiddlewareTrimStrings::class,

IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,

AppHttpMiddlewareTrustProxies::class,

];

分配中间件到路由

如果你想要分配中间件到指定路由,首先应该在 app/Http/Kernel.php 文件中分配给该中间件一个简写的 key,默认情况下,该类的 $routeMiddleware 属性包含了 Laravel 内置的入口中间件,添加你自己的中间件只需要将其追加到后面并为其分配一个 key:

在 AppHttpKernel 里中,添加一行'Test' => AppHttpMiddlewareTest::class,

protected $routeMiddleware = [

'auth' => AppHttpMiddlewareAuthenticate::class,

'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,

'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,

'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,

'Test' => AppHttpMiddlewareTest::class,

];

中间件在 HTTP Kernel 中被定义后,可以使用 middleware 方法链的方式定义路由:

Route::any('test','IndexController@test')->middleware('Test')

如果你需要laravel面试突击,面试题请戳下面,如果你想要看中间件实战,PHP开发APP接口实战里面就使用到中间件来做项目的过滤,点击下视频观看。

IT架构师luke:laravel面试题(全网最全必考面试题)​zhuanlan.zhihu.com

知乎视频​www.zhihu.com

中间件组(分组)

有时候你可能想要通过指定一个键名的方式将相关中间件分到一个组里面,从而更方便将其分配到路由中,这可以通过使用 HTTP Kernel 的 $middlewareGroups 实现。

Laravel 自带了开箱即用的 web 和 api 两个中间件组以包含可以应用到 Web UI 和 API 路由的通用中间件:

/**

* The application's route middleware groups.

*

* @var array

*/

protected $middlewareGroups = [

'web' => [

AppHttpMiddlewareEncryptCookies::class,

IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,

IlluminateSessionMiddlewareStartSession::class,

// IlluminateSessionMiddlewareAuthenticateSession::class,

IlluminateViewMiddlewareShareErrorsFromSession::class,

AppHttpMiddlewareVerifyCsrfToken::class,

IlluminateRoutingMiddlewareSubstituteBindings::class,

],

'api' => [

'throttle:60,1',

'bindings',

],

'Test'=>[

IlluminateSessionMiddlewareStartSession::class,

AppHttpMiddlewareTest::class,

]

];

中间件组可以被分配给路由和控制器动作,使用和单个中间件分配同样的语法。再次申明,中间件组的目的只是让一次分配给路由多个中间件的实现更加简单

Route::group(['middleware' => ['Test']], function() {

Route::get('/', 'IndexController@index');

Route::any('test','IndexController@test');

});

可终止的中间件

有时候中间件可能需要在 HTTP 响应发送到浏览器之后做一些工作。比如,Laravel 内置的“session”中间件会在响应发送到浏览器之后将 Session 数据写到存储器中,为了实现这个,定义一个可终止的中间件并添加 terminate 方法到这个中间件:

<?php

namespace IlluminateSessionMiddleware;

use Closure;

class StartSession

{

public function handle($request, Closure $next)

{

return $next($request);

}

public function terminate($request, $response)

{

// 存储session数据...

}

}

terminate 方法将会接收请求和响应作为参数。一旦你定义了一个可终止的中间件,应该将其加入到 HTTP kernel 的全局中间件列表中。

当调用中间件上的 terminate 方法时,Laravel 将会从服务容器中取出该中间件的新的实例,如果你想要在调用 handle 和 terminate 方法时使用同一个中间件实例,则需要使用容器的 singleton 方法将该中间件注册到容器中。

laravel框架中构造方法中调用session

public function __construct(){

$this->middleware(function ($request, $next) {

$user_data = $request->session() -> get('user_data');

if(empty($user_data)) {

redirect('/login')->send();

}

return $next($request);

});

}

如果你喜欢我写的技术文章以及面试总结,欢迎关注收看我的视频,并且点赞、收藏、关注我哦。

我是luke,感谢你的关注!

很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,希望能够去帮助到小伙伴们,可以关注我私聊获取。也可以加入到我的圈子一起学习成长哦【架构师之路】点击链接申请加入圈子

架构师之路 - 知乎​www.zhihu.com

laravel 中间件不生效_laravel中间件实战(luke)相关推荐

  1. 高性能Redis实战 - 实战入门篇 - 基于 Redis 实现 Laravel 全站访问 PV 统计中间件功能

    1.应用场景 主要用于学习Redis缓存使用,以及如何基于Lavavel(中间件)现实全站PV统计, 触类旁通,其他框架或者功能实现是一样的道理,只是代码实现起来,会有差别- 2.学习/操作 1.文档 ...

  2. Laravel源码解析之中间件

    中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, 而且可以通过应用多个中间件来层层过滤请求 ...

  3. WebLogic管理与维护实战培训(企业级中间件01):基础实战篇

    一.WebLogic管理与维护实战培训(企业级中间件)系列课程介绍 风哥WebLogic管理与维护实战培训专题,风哥本专题共6套课程涉及WebLogic基础实战,WebLogic运维管理,WebLog ...

  4. PHP中间件 middleware,Laravel框架控制器的middleware中间件用法分析

    本文实例讲述了Laravel框架控制器的middleware中间件用法.分享给大家供大家参考,具体如下: 场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件 ...

  5. php web中间件有哪些,HTTP 中间件

    HTTP 中间件 由 学院君 创建于5年前, 最后更新于 11个月前 版本号 #2 51498 views 40 likes 0 collects 1.简介 HTTP 中间件提供了为过滤进入应用的 H ...

  6. 东方通 中间件_东方通:中间件国产替代进程中的艰难领军者

    引言 东方通自1992年成立以来,一直深耕基础软件中间件的产品及相关技术研发,为国产中间件的开创者,连续十几年保持中间件市场占有率国内厂商第一.其时,国外的中间件也才开始起步,可以说与国际厂商站在了同 ...

  7. koa2 mysql 中间件_Koa2 和 Express 中间件对比

    koa2 中间件 koa2的中间件是通过 async await 实现的,中间件执行顺序是"洋葱圈"模型. 中间件之间通过next函数联系,当一个中间件调用 next() 后,会将 ...

  8. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证...

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  9. java数据库中间件实现,分布式数据库中间件DDM的实现原理

    随着数据量不断增大,传统的架构模式难以解决业务量不断增长所带来的问题,特别是在业务成线性.甚至指数级上升的情况.此时我们不得不通过水平扩展,把数据库放到不同服务器上来解决问题,也就是我们说的数据库中间 ...

最新文章

  1. linux脚本expect自动登录,SHELL脚本:利用expect完成SSH自动登录
  2. 电脑php在哪里,电脑上地址栏在哪?
  3. startActivityForResult()
  4. 刷脸取件遭小学生破解,丰巢智能柜紧急下线相关功能
  5. CSS3 Flexbox 弹性盒与 css3 阴影效果的演示
  6. 1013 数素数 (20 分)(c语言)
  7. 论文浅尝 | 利用推理链进行视觉问题回答
  8. thinkpadx1mdt 网络启动_联想ThinkPad X1 Carbon 2020如何进入bios设置从U盘启动?
  9. PostgreSQL 之 CREATE FUNCTION
  10. 2017年多校联合训练 第五场(吉如一)
  11. 实时音频编解码之七 预加重
  12. 【论文阅读】显著性检测 EGNet
  13. 485无线传输通讯模块
  14. Golang底层原理剖析之panic与recover
  15. centos中设置邮件发送
  16. V831 修改启动默认文件
  17. 常见windows进程说明
  18. ti-sdk-evm-am335x-05.07 uboot分析(MLO跳转到u-boot之前)
  19. Java统一日志处理
  20. 电影网站 php asp,asp电影网址导航大全 V20201218

热门文章

  1. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战
  2. R语言sample函数数据对象采样实战
  3. R语言赋值操作符:<−、<<-、=、->、->>、:、%in%、%*%
  4. python使用configparser读取ini格式的配置文件
  5. 词移距离 Word Mover‘s Distance
  6. 测序技术及常见的有几种平台类型
  7. php python 循环,python 怎么用for重复(循环)
  8. 用c语言按颜色对图像进行分类,【leetcode C语言实现】75_颜色分类
  9. oracle中master实例,oracle基础(基本介绍)
  10. linux内核空间open,Linux内核源码分析 - open