设为首页 加入收藏

TOP

laravel5.5源码笔记(一、入口应用的初始化)(一)
2019-08-23 00:34:14 】 浏览:94
Tags:laravel5.5 源码 笔记 入口 应用 初始

laravel的项目入口文件index.php如下

 1 define('LARAVEL_START', microtime(true));
 2 
 3 require __DIR__.'/../vendor/autoload.php';
 4 
 5 $app = require_once __DIR__.'/../bootstrap/app.php';
 6 
 7 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
 8 
 9 $response = $kernel->handle(
10     $request = Illuminate\Http\Request::capture()
11 );
12 
13 $response->send();
14 
15 $kernel->terminate($request, $response);
View Code

 

第一句记录了项目开始运行时间。

第二句引入了基于composer的自动加载模块。

第三句引入了laravel应用主体。

第四句创建了一个用于处理请求的核心。

第五句对实例化后的request对象进行解析并返回执行后的response响应对象。

第六句将响应内容进行输出。

第七句结束应用并释放资源。

关于第二句,这里我先解释一下自动加载,我们都知道php中如果要使用文件外的代码,需要使用require等方法先将文件引入,然后就可以使用被引入那个文件的代码了。但是我们平时使用框架编写代码的时候就不需要这么做了,只需要use命名空间,便可以直接new出对象了,这就要归功于自动加载了,php在new出当前不存在的对象时,会触发__autoload、spl_autoload等一些魔术方法。tp3的处理方式遍是非常粗暴的,在autoload魔术方法中,将当前类use的命名空间与我们new的对象名进行字符串拼接,随后require该文件就完了。laravel使用了composer显然就高级的多,不过再怎么高级,composer本身也是做了类似的操作,所以它也使用了spl_autoload函数,它高级在哪呢?我们都知道composer使用时可以新建一个json文件将需要的依赖编写在里面,composer运行时就会自动下载这些文件了。用composer 做自动加载也是一样,它将json文件里写入的依赖进行缓存成了key/value的关联数组,触发spl_autoload函数的时候便根据这些映射来require。存放在laravel\vendor\composer\autoload_classmap.php文件内,有兴趣的朋友可自行观看,这里不是重点,便到此为止了。(我初学php面向对象的时候一直以为命名空间下面那些use就是用来替代require、include的。直到后来学习mvc概念的时候自己试着做了个微框架的demo,才搞清楚use只是起到明确命名空间的作用。)

 

我们都知道,通常一个web程序所做的事,不外乎这么几点:

1、用户从浏览器进行请求,请求

2、程序接到请求开始运算,网页程序

3、运算结果渲染成网页返回给浏览器,网页响应

我们所写的大量代码都只是为了更好、更快、更方便的去做这3件事而已。

index文件中的$request、$kernel、$response这三个变量就分别与这三点进行对应了。laravel中也将请求、响应、和计算进行了分离,请求部分使用syfmony的request组件对浏览器发出的请求头等信息进行收集打包,形成一个对象来方便我们操作。$kernel算是laravel的请求处理核心了,通过request里的url找到相应路由的控制器,执行后返回视图等响应,并将$response输出至浏览器。知道大概流程后我们来看laravel的核心部分。

第三句代码就是在引入laravel的应用了,我们跳到G:\wamp64\www\test\laravel55\bootstrap\app.php文件内,我们会发现这个文件所做的事情也不多,只是new了一个application对象,调用了三次singleton方法,便将application实例给返回到index文件中了。(而这里new对象的时候整个文件都没有写require等代码,这就是通过composer进行的自动加载起作用了。)application文件位于G:\wamp64\www\test\laravel55\vendor\laravel\framework\src\Illuminate\Foundation\Application.php,new application时传入了当前的路径到它的构造方法里,它的构造方法执行了setBasePath、registerBaseBindings、registerBaseServiceProviders、registerCoreContainerAliases这几个方法。

setBasePath:就是将各个系统关键类的路径存储在了app容器对象里,跟踪到bindPathsInContainer方法里,我们会发现如下所示的,存储的路径,具体的实现代码在其父类Container类的instance方法中,代码很简单就一句是$this->instances[$abstract] = $instance;。大家可以在Application类的setBasePath方法之后使用dd()打印一下$this看看它的instance属性

 1     protected function bindPathsInContainer()
 2     {
 3         $this->instance('path', $this->path());
 4         $this->instance('path.base', $this->basePath());
 5         $this->instance('path.lang', $this->langPath());
 6         $this->instance('path.config', $this->configPath());
 7         $this->instance('path.public', $this->publicPath());
 8         $this->instance('path.storage', $this->storagePath());
 9         $this->instance('path.database', $this->databasePath());
10         $this->instance('path.resources', $this->resourcePath());
11         $this->instance('path.bootstrap', $this->bootstrapPath());
12     }

 

registerBaseBindings:这个方法做的事情和上一个差不多,将$this,application对象及它的父类存入了insta

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇php 无限极分类 下一篇cgi、fastcgi及php-fpm分别是什么

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目