Laravel分析 - 核心篇

2016-05-11  本文已影响1789人  jungledrum

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

核心概念

1、 Container
做两件事情。

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

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初始化

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

下面重点分析后三个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响应。

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

上一篇 下一篇

猜你喜欢

热点阅读