概述
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,看看入口文件到底干了啥所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复