我是靠谱客的博主 机灵发卡,最近开发中收集的这篇文章主要介绍laravel源码分析-public-index.php,看看入口文件到底干了啥,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Public/index.php文件是laravel框架的入口文件,总共就6句代码

 

1:   require __DIR__.’/../bootstrap/autoload.php’;

2: $app = require_once __DIR__.’’/../bootstrap/app.php;

3: $kernel = $app->make(IlluminateContractsHttpKernel::class);

4: $response = $kernel ->handle(

$request = IlluminateHttpRequest::capture()

);

5: $response->send();

6: $kernel->terminate($request,$response);

 

下面我们就来分析这6句代码是干什么用的。

第一句:中有个__DIR__是用来获取当前内容所在文件所在的绝对路径目录名,注意不包含/

对于我本机的环境,__DIR__的值就是/home/vagrant/Laravel/public,

其次要知道require的关键字的特点,如果载入失败require产生 E_COMPILE_ERROR 错误,脚本中止。对比include:若载入失败,产生 E_WARNING 错误,脚本继续执行

对应路径关系,这条语句的意思就是bootstrap下的autoload.php加载进来,根据源码里面的注释翻译:就是注册类自动加载器,可以自动加载类。

 

第二句:中使用了require_once关键词是require的升级版,确保只会加载一次文件,至于怎么确保的你可以不用管,如果有兴趣的可以看一下源码。

然后就是看它加载的同样是bootstrap下的文件,只不过是app.php,但是这个文件返回一个对象,所以用$app接收,因为下面要用到这个对象。

根据源码的注释翻译了解到,这个地方主要是载入整个应用然后我们就能运行它、把响应回给浏览器或用户

 

第三句----第六句是去运行应用,至于这些方法是干啥的,需要从我们刚才引入的那些个文件去查找了。

 

所以下面我们的线索就是bootstrap下的那两个文件autoload.php和app.php

 

先来看autoload.php文件干了什么事

 

我的天呢:就两句代码

1: define(‘LARAVEL_START’,microtime(true));

2: require __DIR__.”/../vendor/autoload.php”

 

第一句就是定义一个常量,来表示框架开始的时间戳,以当前 Unix 时间戳的微秒数:。

这里提示一下常量类似变量,不同之处在于:

1: 在设定以后,常量的值无法更改

2:   常量名不需要开头的美元符号 ($)

3: 作用域不影响对常量的访问

4: 常量值只能是字符串或数字

 

第二句就是加载第三方的统一自动加载脚本。用来自动加载第三方代码。关于第三方部分单独分一个章节来讲解。

然后。。。这个文件就完了。。。。这是一条加载链

 

再来看看app.php这个文件干了啥吧?

 

Oh my god ,这不就是把大象装冰箱总共分几步么

第一步new了个对象,第二步让对象干了三件事,第三步把对象给扔出去了

 

来仔细看看。

$app = new IlluminateFoundationApplication(realpath(__DIR__.’/../’));

这里有一个关于命名空间的知识点(可参考我其他关于命名空间的博文),还使用了第三方类自动加载的手段,这个早在上个文件autoload中就安排妥妥的了。就是实例化出来一个应用,把项目路径当参数传进去了。这样就创建了应用实例,该应用实例要粘合laravel框架其他组件,也要作为ioc(控制反转)容器来给系统绑定各个部分。

 

然后就是绑定一些重要的接口到容器里,用来处理来自web和cli的请求。当然得使用应用这个实例来处理

$app->singleton(

IlluminateContractsHttpKernel::class,  AppHttpKernel::class

);

$app->singleton(

IlluminateContractsConsoleKernel::class,  AppExcetionsHandle::class

);

$app->singleton(

IlluminateContractsDebugExceptionHandler::class, AppExceptionsHandeler::class

);

至于绑的啥,得需要具体研究对应的文件去,这里先不说,只需要知道这里是绑定重要的接口就行了,发挥系统功能的那种。

 

最后把应用实例扔出来,给大家用,好东西大家一起分享嘛。根据注释的意思是,这样可以把这个实例的创建和运行分离开!

 

到此这两个文件就解读完了。此时index.php拿到应用实例干了一些事,干了哪些事,还是不知道,还得去接着查找去。哈哈,那就去干,看看Application这JB玩意到底是个啥。

这里卖个关子,事实上$app->singleton(),用的这个方法并不在application里面,而是在另一个文件中,这是怎么回事呢?先不明说,等把应用实例这个对象弄清楚后,自然而然也就知道是怎么回事了。

 

 

最后

以上就是机灵发卡为你收集整理的laravel源码分析-public-index.php,看看入口文件到底干了啥的全部内容,希望文章能够帮你解决laravel源码分析-public-index.php,看看入口文件到底干了啥所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部