本系列博文使用Lumen5.6
本系列博文竟可能详细,让新人们能看懂,嫌我啰嗦的大神请出门左转
阅读之前,请先确保你已经基本了解lumen或laravel框架的使用
为了便于你在代码中进行各种查找引用,建议使用神器——PhpStorm
通过阅读官方文档,我们可以很容易知道Lumen的入口文件是blog/public/index.php因此我们从这里开始。
这个文件里面东西不多就两行。
$app = require __DIR__.'/../bootstrap/app.php';
$app->run();
这里,可能以前没有深入接触过框架源码的菜鸟来说不太容易理解,没事不急,我们一步一步走。
首先,他是require了一个文件(__DIR__不懂的请自行百度,再回来继续阅读),这里有个bootstrap目录,你没看错,就是bootstrap!不是前端框架的bootstrap,bootstrap是引导程序的意思,也即是说,这个目录里面的东西都是启动引导程序(其实也就只有一个app.php)
require后,返回了一个对象,该对象的引用赋值给$app,然后执行run方法,服务器就启动了。
这里我们暂且不管run方法具体内容。如果有的童鞋看不懂require为什么能返回一个对象,我找了一个比较简单移动的文章点击打开https://blog.csdn.net/yangqicong/article/details/6797082
接下来,就是看app.php里面做了什么了。
首先是autoload.php
require_once __DIR__.'/../vendor/autoload.php';
它包含的其实是composer的autoload,基本的作用就是自动require程序运行中用到的文件,不需要你逐个在各个处理业务的代码文件里面require。符合PSR4规范,如果希望深入了解PSR4的童鞋可以参考这里https://laravel-china.org/topics/2081/psr-specification-psr-4-automatic-loading-specification
接下来是加载环境。这里面的Dotenv类在blog/vendor/vlucas/phpdotenv/src/Dotenv中被定义。
try {
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}
这里你只看到它传递了一个文件路径。但实际上,它的构造函数还有第二个参数
public function __construct($path, $file = '.env')
我们知道,lumen或者说laravel中,有一个环境配置文件blog/.env,也就是说,这里实际上就是将我们配置文件中的信息加载进来。具体加载方式以后再谈。
重点!!重点!!重点!!接下来才是整个文件最关键的部分,创建应用程序的实例
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/
$app = new Laravel\Lumen\Application(
realpath(__DIR__.'/../')
);
所谓创建应用的实例,也就是创建整个应用的核心处理程序。这里新建了Laravel\Lumen\Application的对象,实际上通过上面的注释我们也可以知道,我们的路由以及代码中用到的各种来自laravel或者lumen的组件的实例,都是由这个类的实例内部处理的。这个类的构造函数主要做了四个工作
1. 定义项目根目录
2. 注册框架中经常用到的实例app和path
3. 注册路由
接下来就是绑定一些相关单例模式的容器
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
这里他主要注册了一个异常处理程序和内核服务。这两个服务的具体作用我们这里暂且不深究。需要关注的是在这一段代码上方,还有一部分注释。
/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/
大致意思就是说他们在这里绑定了一些容器,主要用错误处理服务和内核服务。我们如果希望添加自己的容器,也可以用同样的方法在这里添加绑定。当然也可以另外新建文件进行绑定。
我个人建议是,如果有这方面的需求,可以自己新建文件,便于与lumen的官方支持相互区分。
在这之后还有几个注册服务,不过默认是被注释的。主要是中间件服务、鉴权服务、事件服务等。以后用到再继续讲解。
最后就是路由了以及返回应用实例了。
$app->router->group([
'namespace' => 'App\Http\Controllers',
], function ($router) {
require __DIR__.'/../routes/web.php';
});
return $app;
前文所述创建Laravel/Lumen/Application的时候,其构造函数中的路由不是注册具体的uri->controller的路由,而是注册路由解析模块。这里则是注册具体的路由文件web.php。这个文件具体定义了uri->controller的路由,会用laravel的童鞋应该没有疑问,不会用的请先移步官方文档学习https://lumen.laravel.com/docs/5.6/routing
如果你看不懂英文,也可以看看5.3的中文文档关于route的部分https://lumen.laravel-china.org/docs/5.3/routing
基本用法一致,需要注意的是,路由的文件不太一样,5.3的文件是app/Http/routes.php而5.6是routes/web.php
对于返回应用实例,你可以返回上方看一下入口文件的两行代码,其中require操作后获取的对象,获取的就是这里return的$app,这个app也就是前文提到Laravel/Lumen/Application的 实例化对象。执行的run方法,也是这个类里面的成员方法。
本文主要从入口文件开始介绍了Lumen的启动过程,主要包括index.php和app.php两个文件。
在本文主要作用是启蒙菜鸟读框架代码的方式——从入口文件开始,逐步分析。暂且放下每个函数具体内容。
后续会接着介绍Lumen的路由解析过程。
有问题欢迎留言