🎂 Laravel 深入浅出指南 —— 国庆献礼

因为准确性校对等原因,暂时还没搬运到 Laravel-china 来(等全部完成 且校对后,会搬到 Laravel-china 来的)。
文章托管在 Github 我个人项目的 wiki 和 issue 下: https://github.com/xiaohuilam/laravel/wiki

文章的信息量和节奏我觉得还是把控的不错的,适合对 laravel 有一定了解的 phper 进阶时看。

流程图
流程图

在线阅读
xiaohuilam/laravel's wiki

打个招人广告
上海凭远留学,base徐家汇,15-30K/月预算招聘web前端工程师 具体要求请点击

本帖已被设为精华帖!
本帖由系统于 5年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 26

点赞一下

5年前 评论

新手表示看不懂。。。。macro具体作用是啥啊

5年前 评论

@linzi 给一个类扩充自身操作的能力。

5年前 评论

file
有点不理解, 我这样定义macro 那不是跟 scope差不多嘛 , 感觉macro 就是可以给 一些基础类 多添加一些功能,像responce request router这些

5年前 评论

@linzi
--- 编辑线 ---
scope 只能给 Query\Builder 扩充。
并且 scope 这个跟 macro 本身是两个概念诶,scope 可以理解成是查询口径,macro (直译是宏的意思哈),是个装载器,是让程序在运行过程中去动态扩充类的能力。

5年前 评论
农村闲散劳动力

点赞一下, 感谢大佬分享!

5年前 评论

好贴~新人正需要看这种底层实现的,谢谢!

5年前 评论

你们看懂了?@gzfcgsh

5年前 评论
liuqing_hu

@XiaohuiLam @linzi

file

这个回答的补充:
简单来说:

scope 是已有 语法 的使用。
macro 是 扩展功能

阐述:

我们知道 laravel 已经给我们支持了 scope 语法,你在编写模型时遵循这个语法就能够在调用时被 laravel 执行,用的爽。

然而,当 Laravel Eloquent 已有功能不能满足你的需求时怎么办呢?

例如,需要实现一个 数据批量创建或更新 (没有数据就创建,有就依据主键或唯一键更新)的功能,这时你就不那么爽了,因为 laravel 没有提供这个功能嘛。

但是,你可以通过使用 macro 宏,来 扩展 构造器的功能,然后就可以像 Eloquent 内置的方法一样在任何地方使用了!

详细的例子在 这里

5年前 评论

学习,发现的有点晚啊

5年前 评论

支持支持。

5年前 评论

感谢分享!好人一生平安

5年前 评论

谢谢贡献这么好的文章, 对我很有帮助.

有个问题, 在看了源码之后也没能找到答案. 希望能帮忙解答一下.

laravel 的路由中间件可以设置成before 和 after 两种模式, 在路由处理请求源码的那一部分, 我看到是通过pipeline 的方式来一次性加载所有中间件, 并且执行完这些中间件后才将请求 dispatch 给 Route来处理.

那么 laravel 究竟是如何判断哪些中间件是应该在 dispatch 之前进行, 哪些是在执行之后进行?

5年前 评论

@Hexor 通过pipeline 的方式来一次性加载所有中间件 这句话其实应该纠正下,

public function handle()
{
    //...
    $response = $next($request);
    //...
    return $response;
}

一个中间件handle起作用的地方在上面我注释的两处位置。所谓before和after应该就是指请求处理完成前和处理完成后执行的区别吧?

5年前 评论

@XiaohuiLam 你说的对,
但我想问:

对于 before 类型的中间件, 我知道在请求处理之前的 pipeline 中, 都被依次执行了,

但对于 after 类型的中间件来说, 应该是在请求处理之后被执行, 但是在源码里并没有找到它被执行的位置.

我想知道的是: after 类型的中间件是何时在何处代码里被执行的?

5年前 评论

@XiaohuiLam 老哥 找到地方了嘛?

5年前 评论

@Hexor 这段时间没太多时间,还没哈。清明节我好好看看

5年前 评论

@Hexor

file

再确认一下你说的是官网的这个文档吗?

5年前 评论

我看了你的github上的 laravel 执行流程文章, 所以知道了 afterMiddleware 的 handle 方法是被框架内的pipeline调用的, pipeline 会将所有中间件放到一个数组内, 整理优先级后, 依次执行这些中间件的 handle() 方法.

这些你是知道的吧.

但是我看 Laravel 源代码的 pipeline 的执行逻辑是会执行所有中间件的handle() 方法,那么这样一来, beforeMiddleware 和 afterMiddleware 的handle()方法都被执行了, 这样难道不是所有的 middleware 都被当成 beforemiddleware 来执行了吗?

官方文档说 afterMiddleware 是在业务逻辑执行完成后才会被执行的, 这样就跟我看到的代码逻辑不符了, 是我哪里漏掉了吗?

5年前 评论

@Hexor 先于请求执行还是后于请求执行不是在 pipeline 中控制的, 跟middleware的命名也无关.
因为其是这行代码上下文所决定的

$next($request);

例如

// 请求被处理前的逻辑
$response = $next($request);
// 请求被处理后的逻辑

如果你想在业务中拿到请求时, 对请求进行利用, 那么就

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

如果你想对响应加工, 那么在这里处理

public function handle()
{
    $response = $next($request);
    doSomethingHere($response, $request);
    return $response;
}

二者区别在于 $next($request)doSomethingHere($response, $request) 的先后. 与 Pipeline 无一丝关系.

我想你应该明白了吧?

5年前 评论

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