Laravel类似其他php框架,采用了单一入口,入口文件为 /public/index.php ,
/public/index.php 文件:
主要做了这几件事

– 引用 /bootstrap/autoload.php, 这里是类的一些引入机制和优化,这里首先定义了一个常量`LARAVEL_START` , 记录应用开始运行时间,然后引入类文件的自动载入机制,也就是/vendor/autoload.php文件,其实也就是composer自带的类加载器。最后一步提供了一个可优化的方式,通过执行Artisan “optimize” 命令,把常用到的类编译到/bootstrap/cache/compiled.php,这样以后直接require这个类就好了,提高了加载效率,好像在thinkphp上也见过类似的优化。
– 再回到 /public/index.php , 在/bootstrap/app.php 实例化出一个Illuminate\Foundation\Application 对象,命名为$app, 它作为一个IoC容器和胶水绑定系统的各个组件。它在实例化时做了几件事情,
– 执行registerBaseBindings,这个方法调用getInstant方法指向当前对象,是单一模式下的,然后放在成员变量instants数组两个元素,这两个key, 一个叫app,一个叫 Illuminate\Container\Container,但是值都指向这个对象。 所以叫注册基础绑定 ?
– 然后$app继续执行registerBaseServiceProviders方法,注册了两个基础服务的provider :EventServiceProvider和RoutingServiceProvider,,注意,在实例化服务provider里, $app对象是作为一个参数传入的。采用了依赖注入,并且是这是基於构造函数的实现方式。即实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
– 引用自维基百科(https://zh.wikipedia.org/zh/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC)
* 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
– 然后执行registerCoreContainerAliases,注册了一堆别名,就是把一串长长的类名简化了,比如说 ·Illuminate\Filesystem\FilesystemManager 被简化成了filesystem,存入aliases成员中, 可以一个或多个类名指向同一个别名,比如指向cache 的就有
‘Illuminate\Cache\CacheManager’, ‘Illuminate\Contracts\Cache\Factory’。

– 最后注册基础路径 ,即把根目录的绝对路径赋值到basePath成员变量上,这样实例化就完成了。
– 回到/bootstrap/app.php上吧,接着$app对象又执行了三次singleton,一个是http相关,一个是console相关,一个和异常处理相关,就是向容器绑定接口,接受web和CLI的输入请求。

– 返回到 /public/index.php中,$app 执行make方法,产生一个http kernel对象,在这个kernel对象处理http请求,接收请求,发送响应,最后终止程序和一些收尾的工作,这样整个过程就OVER了。

总体而言,Laravel写得还是很漂亮的,结构清晰,继承体系完备,设计模式运用娴熟,充分利用了PHP的新特性,比如命名空间,比如trait, 连数组都是用[]的表示形式。细节很多值得学习的地方,但是感觉是像一个很庞大的体系,特别是Illuminate,要弄懂还需要不少时间。

- EOF -