🎂 Laravel 深入浅出指南 —— 国庆献礼
因为准确性校对等原因,暂时还没搬运到 Laravel-china 来(等全部完成 且校对后,会搬到 Laravel-china 来的)。
文章托管在 Github 我个人项目的 wiki 和 issue 下: https://github.com/xiaohuilam/laravel/wiki
文章的信息量和节奏我觉得还是把控的不错的,适合对 laravel 有一定了解的 phper 进阶时看。
打个招人广告
上海凭远留学,base徐家汇,15-30K/月预算招聘web前端工程师 具体要求请点击。
本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
先点个赞
点赞一下
支持一下
新手表示看不懂。。。。macro具体作用是啥啊
@linzi 给一个类扩充自身操作的能力。
有点不理解, 我这样定义macro 那不是跟 scope差不多嘛 , 感觉macro 就是可以给 一些基础类 多添加一些功能,像responce request router这些
@linzi
--- 编辑线 ---
scope
只能给Query\Builder
扩充。并且
scope
这个跟macro
本身是两个概念诶,scope
可以理解成是查询口径,macro
(直译是宏的意思哈),是个装载器,是让程序在运行过程中去动态扩充类的能力。点赞一下, 感谢大佬分享!
@linzi 我也是新手
好贴~新人正需要看这种底层实现的,谢谢!
你们看懂了?@gzfcgsh
@XiaohuiLam @linzi
这个回答的补充:
简单来说:
阐述:
我们知道 laravel 已经给我们支持了 scope 语法,你在编写模型时遵循这个语法就能够在调用时被 laravel 执行,用的爽。
然而,当 Laravel Eloquent 已有功能不能满足你的需求时怎么办呢?
例如,需要实现一个 数据批量创建或更新 (没有数据就创建,有就依据主键或唯一键更新)的功能,这时你就不那么爽了,因为 laravel 没有提供这个功能嘛。
但是,你可以通过使用 macro 宏,来 扩展 构造器的功能,然后就可以像 Eloquent 内置的方法一样在任何地方使用了!
详细的例子在 这里
不错不错
学习了
学习,发现的有点晚啊
支持支持。
感谢分享!好人一生平安
谢谢贡献这么好的文章, 对我很有帮助.
有个问题, 在看了源码之后也没能找到答案. 希望能帮忙解答一下.
laravel 的路由中间件可以设置成before 和 after 两种模式, 在路由处理请求源码的那一部分, 我看到是通过pipeline 的方式来一次性加载所有中间件, 并且执行完这些中间件后才将请求 dispatch 给 Route来处理.
那么 laravel 究竟是如何判断哪些中间件是应该在 dispatch 之前进行, 哪些是在执行之后进行?
@Hexor
通过pipeline 的方式来一次性加载所有中间件
这句话其实应该纠正下,一个中间件handle起作用的地方在上面我注释的两处位置。所谓before和after应该就是指请求处理完成前和处理完成后执行的区别吧?
@XiaohuiLam 你说的对,
但我想问:
对于 before 类型的中间件, 我知道在请求处理之前的 pipeline 中, 都被依次执行了,
但对于 after 类型的中间件来说, 应该是在请求处理之后被执行, 但是在源码里并没有找到它被执行的位置.
我想知道的是: after 类型的中间件是何时在何处代码里被执行的?
@Hexor
我读下源码哈 😆
@XiaohuiLam 老哥 找到地方了嘛?
@Hexor 这段时间没太多时间,还没哈。清明节我好好看看
@Hexor
再确认一下你说的是官网的这个文档吗?
我看了你的github上的 laravel 执行流程文章, 所以知道了 afterMiddleware 的 handle 方法是被框架内的pipeline调用的, pipeline 会将所有中间件放到一个数组内, 整理优先级后, 依次执行这些中间件的 handle() 方法.
这些你是知道的吧.
但是我看 Laravel 源代码的 pipeline 的执行逻辑是会执行所有中间件的handle() 方法,那么这样一来, beforeMiddleware 和 afterMiddleware 的handle()方法都被执行了, 这样难道不是所有的 middleware 都被当成 beforemiddleware 来执行了吗?
官方文档说 afterMiddleware 是在业务逻辑执行完成后才会被执行的, 这样就跟我看到的代码逻辑不符了, 是我哪里漏掉了吗?
@Hexor 先于请求执行还是后于请求执行不是在 pipeline 中控制的, 跟middleware的命名也无关.
因为其是这行代码上下文所决定的
例如
如果你想在业务中拿到请求时, 对请求进行利用, 那么就
如果你想对响应加工, 那么在这里处理
二者区别在于
$next($request)
和doSomethingHere($response, $request)
的先后. 与 Pipeline 无一丝关系.我想你应该明白了吧?