🎂 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 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 26

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

5年前 评论

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

5年前 评论

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

5年前 评论
liuqing_hu

@XiaohuiLam @linzi

file

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

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

阐述:

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

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

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

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

详细的例子在 这里

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年前 评论

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

这些你是知道的吧.

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

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

5年前 评论

@Hexor

file

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

5年前 评论

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

5年前 评论

@XiaohuiLam 老哥 找到地方了嘛?

5年前 评论

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

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

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

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

5年前 评论

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

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

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

5年前 评论

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

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

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

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

5年前 评论

感谢分享!好人一生平安

5年前 评论

支持支持。

5年前 评论

学习,发现的有点晚啊

5年前 评论

你们看懂了?@gzfcgsh

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

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

5年前 评论

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

5年前 评论

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

5年前 评论

点赞一下

5年前 评论

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