简介我们在现实世界中使用任何一个工具时,如果了解了该工具的工作原理,我们就会得心应手地使用它,应用程序开发也是如此。当您了解开发工具的工作原理时,使用它就会变得更加容易。本文档的目的是向您解释Laravel框架如何在较高层次上工作。对框架有了更全面的了解,一切都不再那么神秘,你也会更有信心地构建应用程序。如果您不能立即理解所有这些术语,请不要灰心!尝试先掌握基础知识,您的知识水平会随着您浏览文档而提高。生命周期概述Laravel应用程序的所有请求入口都是public/index.php文件,所有的请求都会被Web服务器(Apache/Nginx)定向到这个文件。index.php文件的代码并不多,该文件完成了项目依赖服务的加载功能。首先它将composer生成的自动加载器导入到项目中,然后接收由bootstrap/app.php文件创建的应用程序实例。创建实例的过程就是项目初始化的过程。注册基础绑定app->应用实例(Illuminate\Foundation\Application)Illuminate\Container\Container->应用实例(Illuminate\Foundation\Application)EventServieProvider-事件服务提供者EventServieProvider-事件服务提供者注册核心服务容器别名集根路径(如果传入)HTTP/控制台内核接下来,请求被发送到HTTP内核或控制台内核(分别用于处理Web请求和Artisan命令),这取决于进入应用程序的请求类型。这两个内核是所有请求都经过的中央处理器。现在,让我们关注位于app/Http/Kernel.php的HTTP内核。HTTP内核继承自Illuminate\Foundation\Http\Kernel类,它定义了一个引导程序数组。此数组中的类在执行请求之前运行。这些引导程序配置了错误处理、日志记录、[应用程序环境的检测]和其他在处理请求之前需要执行的任务。注册共享内核和异常处理程序Illuminate\Contracts\Http\Kernel->App\Http\KernelIlluminate\Contracts\Console\Kernel->App\Console\KernelIlluminate\Contracts\Debug\ExceptionHandler->App\Exceptions\Handler服务提供者之一内核启动过程中最重要的动作是为应用程序加载[服务提供者]。应用程序的所有服务提供者都在config/app.php配置文件的providers数组中配置。首先调用所有provider的register方法,然后在所有provider注册完成后调用boot方法。服务提供者负责启动框架的所有各种组件,例如数据库、队列、验证器和路由组件。正是因为他们启动并配置了框架提供的所有功能,服务提供者才是整个Laravel启动过程中最重要的一环。处理和分发请求应用程序启动并注册所有服务提供者后,将请求交给路由器分发,路由器将请求分发给路由器或控制器,并运行路由指定的所有中间件.解析Illuminate\Contracts\Http\Kernel,实例化App\Http\Kernelmake之前,系统在父类Illuminate\Foundation\Http\Kernel中进行单例绑定处理请求构造函数:设置$app/$router,初始化$routerb.handle中中间件的值来处理请求——通过路由发送请求:$request是Symfony封装的请求对象,将请求实例注册到容器中($app['request']->Illuminate\Http\Request)清空前容器中的request实例调用bootstrap方法启动启动类的一系列bootstrap方法:Illuminate\Foundation\Bootstrap\DetectEnvironment环境配置($app['env'])Illuminate\Foundation\Bootstrap\LoadConfiguration基本配置($app['config'])Illuminate\Foundation\Bootstrap\ConfigureLogging日志文件($app['log'])Illuminate\Foundation\Bootstrap\HandleExceptions错误&异常处理Illuminate\Foundation\Bootstrap\RegisterFacades清除解析后的Facade并重启,将config文件中alias定义的所有Facade类注册到容器中Illuminate\Foundation\Bootstrap\RegisterProviders注册所有Providers类config中providers定义的es到容器Illuminate\Foundation\Bootstrap\BootProviders调用所有注册Provider的boot方法通过Pipeline发送请求,经过中间件路由转发,最后返回responsenewPipeline($this->app))->send($request)->through($this->middleware)->then($this->dispatchToRouter()c.向浏览器发送响应信息:$response->send();d.处理继承自TerminableMiddleware接口的中间件(Session)并结束应用生命周期:$kernel->terminate($request,$response);关注服务提供者服务提供者是启动Laravel应用最关键的部分,应用实例创建后,注册服务提供者并且请求是交给启动的应用程序处理,整个过程就是这么简单!牢牢掌握Laravel应用程序如何通过服务提供商构建和启动是非常有价值的。当然,默认的服务提供商application存放在app/Providers目录下,AppServiceProvider默认是空的。这里是添加自定义启动和服务容器绑定的最佳位置。当然,对于大型应用,你可能希望创建多个serviceprovider,每个都有一个更细粒度的启动。下面的执行流程图详细描述了上述步骤的执行过程:
