本文为译文,LaravelRequestLifeCycle原创,译文LaravelRequestLifeCycle首发于个人博客,转载请注明出处。使用框架、工具或服务时,请在使用前研究其工作原理。随着原理研究工作的不断深入,会让我们在使用的时候更加得心应手。本文旨在帮助大家掌握《LaravelHTTP请求生命周期》的工作原理。内容涵盖何时向Laravel服务发送HTTP请求,在项目运行的各个阶段如何处理请求,以及框架如何将处理结果返回给用户。我们将带领您一步步揭开其中的秘密。自动加载的第一步,当用户在浏览器中访问该URL时,会发起一个HTTP请求,最后这个请求会发送到我们的Web服务器。Web服务器(Apache或Nginx)通过匹配的服务配置,然后向Laravel中的入口文件public/index.php发送请求,完成项目依赖服务的加载功能。首先将composer生成的autoloader导入到工程中(译注:require__DIR__.'/../vendor/autoload.php';)。然后接收由bootstrap/app.php文件创建的应用程序实例。创建实例的过程就是项目初始化的过程。内核下一步:我们将焦点锁定在应用程序实例的内核部分。应用实例根据HTTP请求的运行环境决定将请求发送给HTTP内核还是Console内核。这两个核心是所有HTTP请求的枢纽。HTTP内核是定义在app/Http/Kernel.php文件中的Kernel实现类。它接收请求并返回响应。就这么简单。但是Kernel类内部定义了很多bootstrapper,会完成错误句柄(handle)配置、日志配置、运行环境识别等所有在请求执行前需要完成的配置工作。不仅如此,Kernel类还定义了很多在处理请求之前需要执行的中间件。服务提供者接下来,内核在引导项目启动时加载服务提供者。应用实例所依赖的服务提供者可以在config/app.php配置文件的providers节点中找到。当调用服务提供者的register()方法时,服务提供者将注册到应用程序实例。所有服务提供者注册到应用实例后,应用实例执行boot方法启动项目。当应用实例完成引导、注册服务器提供者并开始处理时,分发请求将由路由器(Router)转发。路由器将请求转发给注册的路由和对应的控制器(译注:定义在routes/web.php或routes/api.php文件中的路由),并执行当前路由相关的中间件。路由器现在处于处理和呈现请求的阶段:路由器将HTTP请求定向到控制器或通过省略控制器直接返回视图或响应。这些路由将放在??app/routes.php中。路由器将HTTP请求发送到匹配的控制器或视图。我们可以在routes/web.php中定义路由,项目的所有controller都管理在app/Https/Controllers(译注:原app/controllers)目录下,一个controller对应一个operation,向它的view发送数据。视图文件定义在resources/views目录下,其作用是输出数据和响应HTTP请求。下面的执行流程图详细描述了上述步骤的执行过程:
