请求的生命周期

概述

所谓工欲善其事必先利其器。网站应用开发也是如此,理解工具的机理对你很有帮助,你会更有自信和更随心的使用它们。本文档的目的就是让你全面的、深刻的理解laravel框架的工作机理。随着你的理解加深,揭开它的迷纱,就可以更自如的创建应用。我们从 "启动文件"和 应用事件 来开始我们的了解。

刚开始你可能不是理解所有的东西,没关系,不要灰心。你只需要领会基本的东西,随着你阅读其他章节你会慢慢的理解它。

请求的生命周期

所有的请求都是从public/index.php入口的。当我们使用Apache时,.htaccess文件会帮助我们讲所有的请求指向index.php文件。从这里开始,laravel开始处理请求并作出相应。为此,我们从laravel的启动过程开始。

到目前为止,我们了解到laravel启动过程的最重要的是服务提供商(service providers)。在/app/config/app.php配置文件里,提供了一系列的服务提供商,还有一个providers数组。这些提供商作为larvel启动机制的主要部分。再回到index.php文件,一个请求进入index.php文件后,会加载bootstrap/start.php文件,这个文件创建了laravel应用对象,同时是Ioc容器。

创建应用对象后,需要设置几个项目路径和环境检测。接着颞部的启动脚本会被执行,这个文件作用于laravel内部代码,根据你的配置文件的设置来进行设置,比如timezoneerror_reporting 等。更重要的,不是这些选项的设置,而是对应用中配置的服务器提供商(service providers)进行注册。

简单的服务器提供商只有一个方法:register。应用对象通过自己的register方法注册service providers时候,service providersregister方法才会被调用。一般来讲,每个service provider绑定一个或者多个闭包到容器里。在容器里允许你访问这些绑定的服务商。比如,QueueServiceProvider服务器服务注册了一些闭包,来解决涉及类的一些队列。当然,服务器提供商也可以再启动任务里使用而不仅仅是注册到容器里。服务器提供商可以注册 为事件监听、视图组件、Artisan命令等。

当所有的服务提供商被注册后,app/start文件会被加载。最后,app/routes.php文件会被调用。一旦routes.php文件被加载后,请求对象会被转发给应用以方便它转发给其他的路由。

让我们总结一下:

  1. 请求进入public/index.php文件
  2. bootstrap/start.php文件创建一个应用对象并进行环境监测
  3. 内部framework/start.php 文件配置选项并加载服务器提供商
  4. 应用app/start文件会被加载
  5. 应用app/routes.php文件会被加载
  6. 请求对象转发给应用,并返回响应对象
  7. 响应对象发送到终端

现在,你对于一个进入laravel的请求如何被处理有个大致的了解。接下来,我们看下启动文件。

启动文件

你的应用的启动在app/start.php里。默认地,会包含三个文件:global.php,local.php,artisan.php。对于artisan.php更多细节,查看Artisan Comman Line

global.php文件默认包含了一些基本选项,比如:Logger的注册、引入app/filters.php文件。你也可以根据需要自己添加,它会在每个请求中都引入。local.php文件只有在local环境里被调用。关于环境更多信息,请看配置文档

当然,如果你有其他的环境,你也可以创建响应的启动文件,它会在对应环境中自动引入。比如,你配置文件bootstrap/start.php设置为development环境,那么这个应用当前环境下的所有请求都会引入app/start/development.php文件。

启动文件里放什么内容

启动文件就是用来存放启动程序的相关代码,比如,你可以注册一个视图组件、配置你的日志选项及一些PHP的设置等。所有的一切,你都可以自由设置。但是,对于大型的项目来说,太多的启动代码会使得启动文件都别混乱,这时候你可以考虑将一些代码移到 服务器提供商。

应用事件

注册应用事件

捏可以在请求的前后的过程中,注册beforeafterfinishshutdown应用事件:


App::before(function($request)
{
    //
});

App::after(function($request, $response)
{
    //
});

这些事件的监听会在应用每个请求的beforeafter 被调用,它可以用来过滤或者修改请求的响应。你可以注册他们到启动文件中或者一个服务器提供商里。

你也可以注册监听到matched事件上,当一个请求匹配到一个未执行的路由上,则会被调用:

Route::matched(function($route, $request)
{
    //
});

finish事件会在响应被发送到终端后才被调用,它可以用来处理应用最后的任务。shutdown事件则在所有的finish事件处理完所有事件后会被调用,它是脚步执行终止之前最后的处理机会。大多时候,你不需要用到这些事件。