Lumen[Laravel]源码学习 —— 入口文件

本系列博文使用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的路由解析过程。

有问题欢迎留言



你可能感兴趣的:(php,lumen,laravel,源码学习,php,框架)