Terminable 中间件怎么理解?

看中间件文档时,关于Terminable中间件的部分没看懂。

terminate 方法应该同时接收请求和响应。定义了这个中间件之后,别忘了将它添加到路由列表或者 app/Http/Kernel.php 文件的全局中间件中。
当你在中间件上调用 terminate 方法的时候, Laravel 将从 服务容器中解析出一个新的中间件实例。如果在调用 handle 和 terminate 方法的同时使用相同的中间件实例,请使用容器的 singleton 方法在容器中注册中间件。
疑问:

  1. 中间件添加到路由列表或者全局中间件,是不是为了使当前中间件生效,而不是针对terminate方法做的处理?
  2. 在中间件上调用terminate方法是什么意思,前面说“如果你在中间件上定义了一个 terminate 方法,那么它将会在响应准备发送到浏览器之后自动调用。”,不是自动调用么,还是可以手动调用?
  3. 用singleton注册中间件的话是在Provider里手动注册吗?
  4. 如果多个中间件都实现了terminate方法,那么自动调用的顺序是什么样的?
--Max--
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案
  1. 添加到路由或者全局, 目的就是为了在需要的地方启用该中间件, 理解没毛病....
  2. 意思就是 terminate 方法是在所有代码执行完成之后调用, 举个例子: 比如你在控制器 return response() 后, PHP 返回给 Nginx 之前, 这时候可以记录下所有 SQL 查询记录呀什么的
  3. 不是让你去 singleton 绑定中间件. 而是, 比如你在该中间件 handle 跟 terminate 都通过自动注入的方式使用了一个 EasyWeChat 的实例, 那么你应该在 Provide 把这个类绑定为一个单例, 不然在这个会被实例化 2 次(new EasyWeChat 两次)
  4. 目测应该是根据 $middlewarePriority 属性顺序来的(没翻过这部分源码) 文档传送
5年前 评论
讨论数量: 2
  1. 添加到路由或者全局, 目的就是为了在需要的地方启用该中间件, 理解没毛病....
  2. 意思就是 terminate 方法是在所有代码执行完成之后调用, 举个例子: 比如你在控制器 return response() 后, PHP 返回给 Nginx 之前, 这时候可以记录下所有 SQL 查询记录呀什么的
  3. 不是让你去 singleton 绑定中间件. 而是, 比如你在该中间件 handle 跟 terminate 都通过自动注入的方式使用了一个 EasyWeChat 的实例, 那么你应该在 Provide 把这个类绑定为一个单例, 不然在这个会被实例化 2 次(new EasyWeChat 两次)
  4. 目测应该是根据 $middlewarePriority 属性顺序来的(没翻过这部分源码) 文档传送
5年前 评论

file
看源码,是按顺序调用terminate,不过问题3应该是将中间件用singleton绑定,因为handle和terminate时都会make一个中间件,如果不是singleton,就会make出两个中间件实例。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!