文档章节

Laravel源码入门-启动引导过程(三)bootstrap/app.php

zhmsong
 zhmsong
发布于 2017/05/12 20:56
字数 908
阅读 200
收藏 1

从请求发起开始,进入 public/index.php,到 bootstrap/autoload.php,下一步就进入了创建应用实例,代码如下:

/*  /* 来自 public/index.php */
|
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php'

这句代码成为点亮(Turn on),创建了 $app,一切都有了开始,我们看看 bootstrap/app.php。

<?php /* bootstrap/app.php */

/*
|--------------------------------------------------------------------------
| Create The Application 创建应用实例
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
| $app 是 Application 的实例,在面向对象编程(OOP)中实例是基本单位,原因就是面向对象
| 编程,不是面向过程编程,在我们眼中,要开发的东西都是对象,跑起来后都是一个一个的实例。
| 
| $app 这个实例,是个最开始的,也是最基本的实例,说像胶水,应该说像蜘蛛,能产丝一样,把
| Laravel 的各个部分(其实也都是对象)连接起来,有机的连接,就能跑起来了!
|
| $app 也是个容器(Container),Application 继承自 Container,粗浅理解,$app,
| 更像一副骨架,带皮肤的骨架,还没有内部各种组织,是个空的容器,当我们往里填充时,使用的
| 是 Injection 的方法,像科幻片,注入一种生物水,那种生物就在容器内繁殖起来,并发挥作用
| ,如果非要用个好听的名字,用《攻壳特工队》里面的话,就是强化,注入强化!再回顾一下上篇,
| 有一个 make() 方法,这个方法意味解析(resolve)
| 而不是简单的 new 操作,之所以意味着解析(resolve),是因为 $app 是一个容器,各种组件像药水
| 一样以 Injection 的方式注入到了 $app 体内,而在体外,比如 index.php 文件就相当于在 $app
| 体外,要获得 $kernel,就可以用 $app->make(类的名字) 从各种有机融合在一起的药水中来析出来,
| 这也就是 $app 是一个容器的 IoC 控制反转 的理解方式。
| 具体参见https://laravel.com/docs/5.4/container,搜索 “make method”。
|
| 备注:realpath() 函数返回值,作为 Application 构造函数输入参数,这里值为:
| 部署目录:/Users/me/mykaifa/laravel_orig,也就是 bootstrap 的上一级目录。
|
*/

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

/*
|--------------------------------------------------------------------------
| Bind Important Interfaces 绑定重要接口
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
| 这里绑定的三个接口实在重要,一个Web端Kernel,二个是命令行端Kernel,最后一个是异常处理
| 。最基本的。用单例(singleton)来绑定,把三个协议 Contracts 纯接口(无实现)绑定到
| 具体的 App\Http\、App\Console\和App\Exceptions 下的。查阅 Container::singleton()
| 实现代码:singleton($abstract, $concrete),不知是不是 abstract 和 concrete 的关系。
|
*/

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

/*
|--------------------------------------------------------------------------
| Return The Application 脚本执行完返回 $app 到 public/index.php
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/

return $app;

== 总结 ==

bootstrap/app.php 两三行代码,做了大量工作,如果用 dump($app),可以看到。总之是创建了 $app 容器实例,等待着更丰富的注入,让应用活起来、跑起来。

© 著作权归作者所有

共有 人打赏支持
zhmsong
粉丝 40
博文 126
码字总数 65130
作品 0
海淀
程序员
私信 提问
Laravel5.3之bootstrap源码解析

说明:Laravel在把Request通过送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享...

botkenni
2016/10/28
363
0
Laravel 5.1 源码阅读

安装,和创建项目,都是通过Composer,简单,略过。 Entry && Kernel 网站入口文件,${Laravel-project}/public/index.PHP: 生成Request,处理Request(),生成Response,发送Resonse。常规...

botkenni
2016/10/09
25
0
Laravel 框架的下一个主要版本 Laravel 5.6 正式发布

Laravel 5.6 已正式发布,该版本将是 Laravel 框架的下一个主要版本。Laravel 5.6 带来了许多的新特性,下面将简单介绍一下值得关注的更新。有关所有变更的完整列表,请访问更新日志 (GitHu...

michealz
2018/02/09
3.9K
27
laravel 5.1 源码阅读

laravel类似其他php框架,采用了单一入口,入口文件为 /public/index.php /public/index.php主要做了以下几件事: 引用 /bootstrap/autoload.php, 这里是类的一些引入机制和优化,这里首先定义...

FalconChen
2016/03/25
173
1
LARAVEL知识点整理

1,composer安装调试工具 debugbar 安装 Debugbar# 使用 Composer 安装: $ composerrequire"barryvdh/laravel-debugbar:~3.1"--dev 生成配置文件,存放位置config/debugbar.php: $ php ar......

U_KNOW
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 看见这花臂了么?赶紧叫大佬!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享周华健的单曲《有没有一首歌会让你想起我》 《有没有一首歌会让你想起我》- 周华健 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
59分钟前
46
3
Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
3
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
16
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部