Lumen开发:lumen源码解读之初始化(1)——app实例
版权声明:本文为博主原创文章,未经博主允许不得转载。
有些注释来着原文的百度翻译,可以有些难理解或者奇怪,我后面会根据自己的理解做调整的哈!!!不喜勿喷,层主英语不过关。。。
先来看看入口文件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();//为应用程序加载功能强大的库。
和后面的内容!!!
版权声明:本文为博主原创文章,未经博主允许不得转载。
Lumen开发:lumen源码解读之初始化(1)——app实例的更多相关文章
- Lumen开发:lumen源码解读之初始化(4)——服务提供(ServiceProviders)与路由(Routes)
版权声明:本文为博主原创文章,未经博主允许不得转载. 前面讲了singleton和Middleware,现在来继续讲ServiceProviders和Routes,还是看起始文件bootstrap/a ...
- Lumen开发:lumen源码解读之初始化(2)——门面(Facades)与数据库(db)
版权声明:本文为博主原创文章,未经博主允许不得转载. 紧接上一篇 $app->withFacades();//为应用程序注册门面. $app->withEloquent();//为应用程序 ...
- mybatis源码解读(一)——初始化环境
本系列博客将对mybatis的源码进行解读,关于mybatis的使用教程,可以查看我前面写的博客——传送门. 为了便于后面的讲解,我们这里首先构造一个统一环境.也可以参考mybatis官网. 1.数据 ...
- Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php / * | --------- ...
- Lumen开发:lumen源码解读之初始化(5)——注册(register)与启动(boot)
版权声明:本文为博主原创文章,未经博主允许不得转载. register()是在服务容器注册服务, bootstrap/app.php /** * 注册外部服务 */ $app->register ...
- Vue 源码解读(2)—— Vue 初始化过程
当学习成为了习惯,知识也就变成了常识. 感谢各位的 点赞.收藏和评论. 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读之SDWebImageCache(上)
第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
随机推荐
- Xamarin.Forms 调用腾讯地图
用Xamarin.Forms 也有一段时间了,跨平台,生成native代码的噱头 天花乱坠的, 其中的坑,只有用过的人才懂... 就拿地图来说...总不能用google地图吧 于是只能自己想办法了. ...
- Architecting Android…The clean way?
Architecting Android-The clean way? 原文链接:http://fernandocejas.com/2014/09/03/architecting-android-th ...
- 天地图应用ArcGIS发布的服务(转)
天地图应用ArcGIS发布的服务 本文包含三个部分:利用ArcMap将Excel的数据转化为ArcGIS MXD文件.利用ArcMap发布服务.天地图添加ArcGIS发布的服务. 一 MXD文件的生成 ...
- ISP图像处理算法之---Demosaic
目前市场上主流传感器为Coms传感器,sensor出来的的数据格式为bayer数据格式,这种格式,每个像素点只有三个颜色通道中的一个,如图1所示 ...
- CSU - 1542 Flipping Parentheses (线段树)
CSU - 1542 Flipping Parentheses Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld ...
- SQL Script for read information from a csv file in FTP Server
DECLARE w_file_path VARCHAR2(4000) := 'XXIF_INPUT'; --all_directories.directory_name w_file_name VAR ...
- 【Hadoop】Hadoop MR 自定义序列化类
1.基本概念 2.Mapper代码 package com.ares.hadoop.mr.flowsum; import java.io.IOException; import org.apache. ...
- block传值以及利用block封装一个网络请求类
1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...
- Git版本管理
1.显示当前工作目录 pwd 2.把当前目录初始化为git可以管理的仓库 git init 3.把文件添加到仓库 git add xxx.txt 4.告诉git,把文件提交到仓库 .-m后面输入的是本 ...
- JavaScript字符编解码
示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF ...