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

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

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

流程图
流程图

在线阅读
xiaohuilam/laravel's wiki

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

Fine or not, never stop. Laravel 运行生命周期解析

本帖已被设为精华帖!
本帖由系统于 7个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 26
Ellison

先点个赞

7个月前
BradStevens

点赞一下

7个月前

支持一下

7个月前

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

7个月前
XiaohuiLam

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

7个月前

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

7个月前
XiaohuiLam

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

7个月前
农村闲散劳动力

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

7个月前
gzfcgsh

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

7个月前

你们看懂了?@gzfcgsh

7个月前
liuqing_hu

@XiaohuiLam @linzi

file

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

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

阐述:

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

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

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

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

详细的例子在 这里

5个月前

不错不错

5个月前

学习了

5个月前

学习,发现的有点晚啊

5个月前

支持支持。

4个月前

感谢分享!好人一生平安

4个月前

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

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

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

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

1个月前
XiaohuiLam

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

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

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

1个月前

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

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

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

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

1个月前
XiaohuiLam

@Hexor
我读下源码哈 😆

1个月前

@XiaohuiLam 老哥 找到地方了嘛?

1个月前
XiaohuiLam

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

1个月前
XiaohuiLam

@Hexor

file

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

1个月前

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

这些你是知道的吧.

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

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

1个月前
XiaohuiLam

@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 无一丝关系.

我想你应该明白了吧?

1个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会