文档章节

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

zhmsong
 zhmsong
发布于 2017/05/12 20:56
字数 908
阅读 137
收藏 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 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
Laravel 4 入门三讲(上)laravel 在启动的时候到底做了什么?

  在 Laravel 4 的官方文档里介绍了如何快速的使用它来开始程序的开发。然而相对于如何快速的输出“Hello Word!”笔者更关心的,是在执行到“Hello Word!”这句代码之前程序都做了哪些事情...

成武
2013/11/26
0
5

没有更多内容

加载失败,请刷新页面

加载更多

74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
15分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
19分钟前
0
0
爬虫入门

导读 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取...

问题终结者
19分钟前
0
0
ppwjs之bootstrap文字排版:无序列表项不换行

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
26分钟前
0
0
SpringBoot 学习一

本文将从以下几个方面介绍: 前言 HelloWorld 读取配置文件 例子(CURD) 前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

tsmyk0715
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部