版权声明:本文为博主原创文章,未经博主允许不得转载。

有些注释来着原文的百度翻译,可以有些难理解或者奇怪,我后面会根据自己的理解做调整的哈!!!不喜勿喷,层主英语不过关。。。

先来看看入口文件public/index.php

//请求头
header('Content-Type: application/json; charset=utf-8'); /*
|--------------------------------------------------------------------------
| Create The Application(创建应用程序)
|--------------------------------------------------------------------------
| 首先我们需要一个应用实例。
| 这将创建一个应用程序的实例/容器和应用程序准备好接收HTTP /控制台从环境要求。
*/
$app = require __DIR__.'/../bootstrap/app.php'; /*
|--------------------------------------------------------------------------
| Run The Application (运行应用程序)
|--------------------------------------------------------------------------
| 一旦我们有了应用程序,
| 我们就可以通过内核处理传入的请求,并将相关的响应发送回客户机的浏览器,
| 让他们享受我们为他们准备的创造性和奇妙的应用程序。
*/
$app->run();

  

那么现在最重要的就是bootstrap/app.php了

require_once __DIR__ . '/../vendor/autoload.php';

try {
(new Dotenv\Dotenv(__DIR__ . '/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}

这里是引入Composer的包,之前讲过,这里不详谈。Dotenv是env配置的使用。

往下看

/*
|--------------------------------------------------------------------------
| Create The Application(创建应用程序)
|--------------------------------------------------------------------------
|
| 在这里,我们将加载环境并创建作为该框架的中心部分的应用程序实例。
| 我们将使用这个应用程序作为这个框架的“IOC”容器和路由器。
|
*/ $app = new Laravel\Lumen\Application(
realpath(__DIR__ . '/../')
); $app->withFacades(); $app->withEloquent();
Laravel\Lumen\Application

    

  class Application extends Container
  {

    use Concerns\RoutesRequests,
      Concerns\RegistersExceptionHandlers;

     ...
  /**
* Create a new Lumen application instance.(创建一个新的Lumen应用程序实例。)
*/
public function __construct($basePath = null)
{
if (! empty(env('APP_TIMEZONE'))) {
date_default_timezone_set(env('APP_TIMEZONE', 'UTC'));
} $this->basePath = $basePath; $this->bootstrapContainer();
$this->registerErrorHandling();
}
这个可以说是整个Lumen应用程序最最核心的类了,上继承了核心容器类(Container),左右引用了Concerns\RoutesRequests(路由),Concerns\RegistersExceptionHandlers(异常处理),下又实例了app对象,很是重要喔!!!

$this->bootstrapContainer();
    /**
* Bootstrap the application container.(引导应用程序容器)
*
* @return void
*/
protected function bootstrapContainer()
{
static::setInstance($this); $this->instance('app', $this);
$this->instance('Laravel\Lumen\Application', $this); $this->instance('path', $this->path()); $this->registerContainerAliases();
}

Lumen的依赖注入服务主要都是在容器(Container)中进行,所以说这个步骤很重要,

先看看setInstance()函数

    /**
* Set the shared instance of the container.(设置容器的共享实例。)
*
* @param \Illuminate\Contracts\Container\Container|null $container
* @return static
*/
public static function setInstance(ContainerContract $container = null)
{
return static::$instance = $container;
}

简单一句话,把当前继承Container,实现ContainerContract接口的Application的app实例,注册到Container的$instance对象中,感觉这样就实现了相互之间的贯穿,后面会有大用!

然后就到了$this->instance()函数了,

  /**
* Register an existing instance as shared in the container.(登记一个现有的实例所共享的容器。)
*/
public function instance($abstract, $instance)
{
$this->removeAbstractAlias($abstract);//从上下文绑定缓存中删除一个别名。 $isBound = $this->bound($abstract);//确定给定的类型已被绑定。 unset($this->aliases[$abstract]);//删除对应注册类型别名。 //TODO 翻译修正
     //检查以确定此类型是否已被绑定,
//如果有我们将触发与容器注册的回调和反射可以消费类已经解决这里的更新。
$this->instances[$abstract] = $instance; if ($isBound) {
$this->rebound($abstract);//触发回调给定的抽象类型
}
}

再到$this->registerContainerAliases()函数,这个函数用于注释核心容器的别名

protected function registerContainerAliases()
{
$this->aliases = [
'Illuminate\Contracts\Foundation\Application' => 'app',
'Illuminate\Contracts\Auth\Factory' => 'auth',
'Illuminate\Contracts\Auth\Guard' => 'auth.driver',
'Illuminate\Contracts\Cache\Factory' => 'cache',
'Illuminate\Contracts\Cache\Repository' => 'cache.store',
'Illuminate\Contracts\Config\Repository' => 'config',
'Illuminate\Container\Container' => 'app',
'Illuminate\Contracts\Container\Container' => 'app',
'Illuminate\Database\ConnectionResolverInterface' => 'db',
'Illuminate\Database\DatabaseManager' => 'db',
'Illuminate\Contracts\Encryption\Encrypter' => 'encrypter',
'Illuminate\Contracts\Events\Dispatcher' => 'events',
'Illuminate\Contracts\Hashing\Hasher' => 'hash',
'log' => 'Psr\Log\LoggerInterface',
'Illuminate\Contracts\Queue\Factory' => 'queue',
'Illuminate\Contracts\Queue\Queue' => 'queue.connection',
'request' => 'Illuminate\Http\Request',
'Laravel\Lumen\Routing\UrlGenerator' => 'url',
'Illuminate\Contracts\Validation\Factory' => 'validator',
'Illuminate\Contracts\View\Factory' => 'view',
];
}

有木有对这些名称很熟悉的感觉!

至此$this->bootstrapContainer()就执行完了,再来看看$this->registerErrorHandling(),既然是异常处理,肯定是在Concerns\RegistersExceptionHandlers(异常处理)里了

    /**
* Set the error handling for the application.(设置应用程序的错误处理。)
*
* @return void
*/
protected function registerErrorHandling()
{
error_reporting(-1); set_error_handler(function ($level, $message, $file = '', $line = 0) {
if (error_reporting() & $level) {
throw new ErrorException($message, 0, $level, $file, $line);
}
}); set_exception_handler(function ($e) {
$this->handleUncaughtException($e);
}); register_shutdown_function(function () {
$this->handleShutdown();
});
}

这部分后面在写一篇文做补充,http://...

到这里,$app应用程序就初始好了,下一篇会接着讲

$app->withFacades();//为应用程序注册门面。

$app->withEloquent();//为应用程序加载功能强大的库。

和后面的内容!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. java多线程学习-同步之线程通信
  2. jQuery动画流程分析
  3. linux 系统 tar 的用法详解
  4. Nutch搜索引擎系列
  5. android 世界各国英文简写代码 资源文件
  6. [string]Roman to Integer,Integer to Roman
  7. JSON & XML 简析
  8. Python/MySQL(一、基础)
  9. webpack构建Vue工程
  10. Selenium切换窗口,警告框处理,调用JavaScript代码
  11. [Android]Linux下WebRTC下载与编译
  12. 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
  13. Android WebView常见问题及解决方案汇总【很全很实用】
  14. REST WebService与SOAP WebService的比较
  15. 【BZOJ 1430】 1430: 小猴打架 (Prufer数列)
  16. Spark简介及其在ubuntu下的安装使用
  17. R语言-查看加载包、卸除加载包及安装包与卸载包
  18. python之建完model之后操作admin
  19. 1.0 JAVA基础核心概念
  20. Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning

热门文章

  1. 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?
  2. pip install 报错UnicodeDecodeError: 'ascii' codec can't decode byte
  3. 双人对战的球类游戏ios源代码项目
  4. Oracle基础(二) 创建数据库实例
  5. 计算两个有序数组的第K大数(转)
  6. Android插件化开发,初入殿堂
  7. jdk1.6 升级到 jdk1.7
  8. iOS时间间隔判断
  9. Android中database所在文件夹路径(9.6)
  10. win10 安装anaconda 无法使用pip 报错缺少SSL模块