Laravel分析 - 核心篇

文字总是没有代码简明。这里只是将主要的类和流程进行记录,类似于目录或者地图的功能,不至于面对一堆源码的时候摸不到头绪。具体的实现细节还是要看代码。

核心概念

1、 Container
做两件事情。

  • 绑定 bind()
    将具体实现转为闭包,然后和接口对应起来,放在数组bindings中保存。
  • 解析 make()
    查询bindings,将接口的对应实现类找到,通过反射,将类实例化返回。通过ReflectionClass类实现。

2、Application
继承自Container,主要提供下面3个方法。

  • bootstrap() 启动
    依次调用7个Bootstrapper进行启动。
  • register() 注册ServiceProvider
    调用ServiceProvider的register()方法。
  • boot()
    将App的状态设为已经启动,调用ServiceProvider的boot()方法。

3、ServiceProvider
所有的功能都是以服务形式进行提供,例如:认证、权限、缓存、路由等。需要提供register()方法向Application注册,可提供boot()方法在Application启动后调用。

4、Contract
一堆接口,当你不知道一个类的主要作用的时候,可以看看其实现的接口。

5、Facade
给类起一个别名,方便调用。(ps:纯属增加复杂度,我更喜欢逻辑上的简单,不喜欢这种少打几个字母的方便)

6、 Bootstrapper
启动器,App也就是框架启动的过程。

一次请求的过程

// 初始化App,并启动
$app = new Application();  

// 处理请求的核心类,关联路由
$kernel = new Kernel($app,$router);  

// 将$_GET,$_POST等封装到$request里
$request = Request::capture();  

// 根据路由找到对应函数处理请求,生成相应
$response = $kernel->handle($request);  

$response->send();  //  发送响应
$kernel->terminate();  // 善后

Application的启动流程

首先,App初始化

  • registerBaseBindings()
  • registerBaseServiceProviders()
  • registerCoreContainerAliases()

App启动,依次调用以下bootstrapper的bootstrap()方法,等到BootProviders启动后,依次再调用bootstrapper的boot()方法。

  • DetectEnvironment 检测环境
  • LoadConfiguration 加载设置
  • ConfigureLogging 设置日志
  • HandleExceptions 捕获异常
  • RegisterFacades 注册Facade
  • RegisterProviders 注册ServiceProvider
  • BootProviders 启动ServiceProvider

下面重点分析后三个Bootstrapper

RegisterFacades()
config/app.php中的别名aliases进行注册。
通过spl_autoload_register注册自动加载器,class_alias方法注册别名。
通过注册别名,可以直接使用例如Route::get()Cache::get()之类的方法,类加载器会自动找到对应的类的方法。

RegisterProviders()
config/app.php中的providers进行注册。ProviderRepository会读取配置文件中的ServiceProvider,并会编译一份做为缓存,然后向App注册。

BootProviders()
调用各provider的boot()方法。

如何处理请求

路由是由RouteServiceProvider进行提供,在App启动的过程中会调用Http/routes.php文件,将路由放入RouteCollection中。当有一个请求到来的时候Kernel会匹配到对应的路由,然后调用相应的Controller或者函数进行处理。Controller会渲染模板或者其他的HTTP响应。

具体的框架核心部分也就这么多了。剩下的就是每个服务组件的实现细节问题了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,679评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,085评论 25 707
  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,029评论 0 12
  • Model的类型 ASP.NET的大师级人物Dino Esposito将ASP.NET MVC内使用到的Model...
    simonzfq阅读 428评论 0 0