laravel 5.1 源码阅读

laravel相似其余php框架,采用了单一入口,入口文件为 /public/index.phpphp

/public/index.php主要作了如下几件事:laravel

  • 引用 /bootstrap/autoload.php, 这里是类的一些引入机制和优化,这里首先定义了一个常量LARAVEL_START , 记录应用开始运行时间,而后引入类文件的自动载入机制,也就是/vendor/autoload.php文件,其实也就是composer自带的类加载器。最后一步提供了一个可优化的方式,经过执行Artisan "optimize” 命令,把经常使用到的类编译到/bootstrap/cache/compiled.php,这样之后直接require这个类就行了,提升了加载效率,好像在thinkphp上也见过相似的优化。web

  • 再回到 /public/index.php , 在/bootstrap/app.php 实例化出一个Illuminate\Foundation\Application 对象,命名为$app, 它做为一个IoC容器和胶水绑定系统的各个组件。它在实例化时作了几件事情,thinkphp

    • 执行registerBaseBindings,这个方法调用getInstant方法指向当前对象,是单一模式下的,而后放在成员变量instants数组两个元素,这两个key, 一个叫app,一个叫 Illuminate\Container\Container,可是值都指向这个对象。 因此叫注册基础绑定 ?编程

    • 而后$app继续执行registerBaseServiceProviders方法,注册了两个基础服务的provider :EventServiceProvider和RoutingServiceProvider,,注意,在实例化服务provider里, $app对象是做为一个参数传入的。采用了依赖注入,而且是这是基於构造函数的实现方式。即实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。bootstrap

      • 控制反转(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的输入请求。php框架

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

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

相关文章
相关标签/搜索