跟我学Laravel之请求(Request)的生命周期

概述

在现实世界中使用工具时,如果理解了工具的工作原理,使用起来就会更加有底气。应用开发也是如此。当你理解了开发工具是如何工作的,使用起来就会更加自如。这篇文档的目标就是提供一个高层次的概述,使你对于Laravel框架的运行方式有一个较好的把握。在更好地了解了整个框架之后,框架的组件和功能就不再显得那么神秘,开发起应用来也更加得心应手。这篇文档包含了关于请求生命周期的高层次概述,以及启动文件和应用程序事件的相关内容。

如果你不能立即理解所有的术语,别灰心,可以先有一个大致的把握,在阅读文档其他章节的过程中继续积累和消化知识。

请求的生命周期

发送给应用程序的所有请求都经由 public/index.php 脚本处理。如果使用的是 Apache 服务器,Laravel中包含的 .htaccess 文件将对所有请求进行处理并传递给 index.php。这是Laravel从接受客户端请求到返回响应给客户端的整个过程的开始。若能对于Laravel的引导过程(bootstrap process)有一个大致的认识,将有助于理解框架,我们不妨先讨论这个。

到目前为止,学习Laravel引导过程所需掌握的最重要的概念就是 服务提供器。打开 app/config/app.php 配置文件,找到 providers 数组,你会发现一个服务提供器的列表。这些提供器充当了Laravel的主要引导机制。在我们深入服务提供器之前,先回到 index.php的讨论。当一个请求进入 index.php 文件,bootstrap/start.php 文件会被加载。这个文件会创建一个 Laravel Application 对象,该对象同时作为框架的 IoC 容器。

Application 对象创建完成后,框架会设置一些路径信息并运行 环境检测 。然后会执行位于Laravel源码内部的引导脚本,并根据你的配置文件设置时区、错误报告等其他信息。除了配置这些琐碎的配置选项以外,该脚本还会做一件非常重要的事情:注册所有为应用程序配置的服务提供器。

简单的服务提供器只包含一个方法:register。当应用程序对象通过自身的 register 方法注册某个服务提供器时,会调用该服务提供器的 register 方法。服务提供器通过这个方法向 IoC 容器 注册一些东西。从本质上讲,每个服务提供器都是将一个或多个 闭包 绑定到容器中,你可以通过这些闭包访问绑定到应用程序的服务。例如,QueueServiceProvider 注册了多个闭包以便使用与 队列 相关的多个类。当然,服务提供器并不局限于向IoC容器注册内容,而是可以用于任何引导性质的任务。服务提供器可以注册事件监听器、视图合成器、Artisan命令等等。

在注册完所有服务提供器后,app/start 下的文件会被加载。最后,app/routes.php 文件会被加载。一旦 routes.php 文件被加载,Request 对象就被发送给应用程序对象,继而被派发到某个路由上。

我们总结一下:

请求进入 public/index.php 文件。
bootstrap/start.php 文件创建应用程序对象并检测环境。
内部的 framework/start.php 文件配置相关设置并加载服务提供器。
加载应用程序 app/start 目录下的文件。
加载应用程序的 app/routes.php 文件。
将 Request 对象发送给应用程序对象,应用程序对象返回一个 Response 对象。
将 Response 对象发回客户端。
你应该已经掌握了 Laravel 应用程序是如何处理发来的请求的。下面我们来看一下启动文件。

启动文件

应用程序的启动文件被存放在app/start目录中。默认情况下,该目录下包含三个文件:global.php、local.php 和 artisan.php文件。需要获取更多关于artisan.php的信息,可以参考文档Artisan 命令行。

global.php启动文件默认包含一些基本项目,例如日志的注册以及载入app/filters.php 文件。然而,你可以在该文件里做任何你想做的事情。无论在什么环境下,它都将会被自动包含进_每一个_request中。而local.php 文件仅在local环境下被执行。获取更多关于环境的信息,请查看文档配置。

当然,如果除了local环境你还有其他环境的话,你也可以为针对这些环境创建启动文件。这些文件将在应用程序运行在该环境中时被自动包含。假设你在 bootstrap/start.php 文件中配置了一个 development 环境,你可以创建一个 app/start/development.php 文件,在那个环境下任何进入应用程序的请求都会包含该文件。

启动文件里存放什么

启动文件主要用来存放任何“引导”性质的代码。例如,你可以在启动文件中注册视图合成器,配置日志信息,或是进行一些PHP设置等。具体做什么取决于你。当然了,把所有引导代码都丢到启动文件里会使启动文件变得杂乱。对于大型应用而言,或是启动文件显得太杂乱了,请考虑将某些引导代码移至 服务提供器 中。

应用程序事件

你还可以通过注册 before、after、finish 和 shutdown应用程序事件以便在处理request之前或后做一些操作:

注册应用程序事件

代码如下:

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

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

这些事件的监听器会在每个到达应用程序的请求处理之前(before)或之后(after)运行。可以利用这些事件来设置全局过滤器(filter),或是对于发回客户端的响应(response)统一进行修改。你可以在某个启动文件中或者 服务提供器 中注册这些事件。

当来自应用程序的响应发送至客户端后会触发 finish 事件。这个事件适合处理应用程序所需的最后的收尾工作。当所有 finish 事件的监听器都执行完毕后会立即触发 shutdown 事件,如果想在脚本结束前再做一些事情,这是最后的机会。不过在大多数情况下,你都不需要用到这些事件。

(0)

相关推荐

  • 跟我学Laravel之请求与输入

    基本输入 Laravel使用一种简单的方式来访问用户提交的信息. 你可以用统一的方式来访问用户提交的信息,而不用为用户提交信息的方式操心. 获取一个用户提交的值 复制代码 代码如下: $name = Input::get('name'); 为用户提交信息指定一个的默认返回值(如果用户未提交) 复制代码 代码如下: $name = Input::get('name', 'Sally'); 判断指定的提交信息是否存在 复制代码 代码如下: if (Input::has('name')) {    

  • 跟我学Laravel之配置Laravel

    当你需要在运行时访问配置项时,可以使用Config类: 获取一个配置项的值** 复制代码 代码如下: Config::get('app.timezone'); 如果配置项不存在,你还可以指定返回的默认值: 复制代码 代码如下: $timezone = Config::get('app.timezone', 'UTC'); 为配置项赋值 注意"点"式语法可以用来访问不同文件里的配置项的值.你还可以在运行时为配置项赋值.: 复制代码 代码如下: Config::set('database.

  • 跟我学Laravel之快速入门

    安装 Laravel框架使用 Composer 执行安装和依赖管理.如果还没有安装的话,现在就开始 安装 Composer 吧. 安装Composer之后,你就可以通过命令行使用如下命令安装Laravel了: composer create-project laravel/laravel your-project-name 或者,你可以从 Github仓库 下载.接下来,在 安装Composer 之后,在项目根目录下执行 composer install 命令.该命令将会下载以及安装框架的依赖组

  • Laravel框架学习笔记(一)环境搭建

    为什么选择laravel框架,是因为laravel框架目前是Php最流行的框架,深入研究后发现和asp.net mvc框架在功能上基本上是伯仲之间.只是各自的实现方法不同. php在windows下的开发环境搭建 1.下载php地址http://windows.php.net/download/注意相关版本,我的服务器用的iis7.5 32 系统 VC11 x86 Non Thread Safe 解压之后放到相应的目录,配置php.ini文件,这里注意里面的dll启用的相关配置,这个网上有也不多

  • 跟我学Laravel之路由

    基本路由 应用中的大多数路都会定义在 app/routes.php 文件中.最简单的Laravel路由由URI和闭包回调函数组成. 基本 GET 路由 复制代码 代码如下: Route::get('/', function() {     return 'Hello World'; }); 基本 POST 路由 复制代码 代码如下: Route::post('foo/bar', function() {     return 'Hello World'; }); 注册一个可以响应任何HTTP动作

  • Laravel框架学习笔记(二)项目实战之模型(Models)

    在开发mvc项目时,models都是第一步. 下面就从建模开始. 1.实体关系图, 由于不知道php有什么好的建模工具,这里我用的vs ado.net实体模型数据建模 下面开始laravel编码,编码之前首先得配置数据库连接,在app/config/database.php文件 'mysql' => array( 'driver' => 'mysql', 'read' => array( 'host' => '127.0.0.1:3306', ), 'write' => ar

  • 跟我学Laravel之视图 & Response

    基本Response 从路由中返回字符串 复制代码 代码如下: Route::get('/', function() {     return 'Hello World'; }); 创建自定义Response Response类继承自Symfony\Component\HttpFoundation\Response类,提供了多种方法用于构建HTTP Response. 复制代码 代码如下: $response = Response::make($contents, $statusCode); $

  • 跟我学Laravel之安装Laravel

    安装Composer Laravel框架使用Composer(PHP包管理工具,参考 Composer 中文文档)来管理代码依赖性. 首先,你需要下载Composer的PHAR打包文件( composer.phar ),下载完成后把它放在项目目录下或者放到 usr/local/bin 目录下以便在系统中全局调用.在Windows操作系统中,你可以使用Composer的Windows安装工具. 安装Laravel 通过 Laravel 安装器安装 先下载 Laravel 安装器 PHAR 文件.为

  • 跟我学Laravel之请求(Request)的生命周期

    概述 在现实世界中使用工具时,如果理解了工具的工作原理,使用起来就会更加有底气.应用开发也是如此.当你理解了开发工具是如何工作的,使用起来就会更加自如.这篇文档的目标就是提供一个高层次的概述,使你对于Laravel框架的运行方式有一个较好的把握.在更好地了解了整个框架之后,框架的组件和功能就不再显得那么神秘,开发起应用来也更加得心应手.这篇文档包含了关于请求生命周期的高层次概述,以及启动文件和应用程序事件的相关内容. 如果你不能立即理解所有的术语,别灰心,可以先有一个大致的把握,在阅读文档其他章

  • java遍历http请求request的所有参数实现方法

    通过程序遍历http请求的所有参数放到hashmap中,用的时候方便了. 如果参数值有中文,那么需要在程序中添加filter转码,或者在下面程序里,对paramValue转码 如下所示: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map map = new HashMap(); Enumeration para

  • http请求 request失败自动重新尝试代码示例

    本文研究的主要是http请求 request失败自动重新尝试的一个例子,具体如下. 需求 最近开发一个项目,要实现的一个场景是对于某个http请求,如果请求失败,需要再自动尝试几次,并记录异常原因便于排查 代码实现 #http连接有问题时候,自动重连 def conn_try_again(function): RETRIES = 0 #重试的次数 count = {"num": RETRIES} def wrapped(*args, **kwargs): try: return fun

  • Laravel框架生命周期与原理分析

    本文实例讲述了Laravel框架生命周期与原理.分享给大家供大家参考,具体如下: 引言: 如果你对一件工具的使用原理了如指掌,那么你在用这件工具的时候会充满信心! 正文: 一旦用户(浏览器)发送了一个HTTP请求,我们的apache或者nginx一般都转到index.php,因此,之后的一系列步骤都是从index.php开始的,我们先来看一看这个文件代码. <?php require __DIR__.'/../bootstrap/autoload.php'; $app = require_onc

  • Django form表单与请求的生命周期步骤详解

    Django中请求的生命周期 HTTP请求及服务端响应中传输的所有数据都是字符串 步骤 用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务器 url经过wsgi和中间件,到达路由映射表,在路由中一条一条进行匹配 视图函数根据客户端的请求查询响应的数据,返回给 DjangoDjango把客户端想要的数据做为一个字符串返回给客户端 客户端浏览器接收到返回的数据,经过渲染后显示给用户 FBV 一个url对应一个视图函数 在url匹配成功之后,会直接执行对应的视图函数. CBV 一个url对

  • Django框架请求生命周期实现原理

    先看一张图吧! 1.请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf.request.session - 路由匹配 - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm.templates => 渲染 - 中间件,对响应的数据进行处理. - wsgi,将响应的内容发送给浏览器. 2.什么wsgi wsgi:

  • thinkPHP5.0框架应用请求生命周期分析

    本文实例讲述了thinkPHP5.0框架应用请求生命周期.分享给大家供大家参考,具体如下: 本篇内容我们对ThinkPHP5.0的应用请求的生命周期做大致的介绍,以便于开发者了解整个执行流程. 1.入口文件 用户发起的请求都会经过应用的入口文件,通常是 public/index.php文件.当然,你也可以更改或者增加新的入口文件. 通常入口文件的代码都比较简单,一个普通的入口文件代码如下: // 应用入口文件 // 定义项目路径 define('APP_PATH', __DIR__ . '/..

  • Vue生命周期activated之返回上一页不重新请求数据操作

    activated: 英文原意:使活动.触发 在Vue的生命周期函数中,这个好像用的不是特别多?(也许只是在我的工作中这个用的不多,或者说叫几乎不用这个) 一.需求 前不久在项目中有这样一个需求: 在订单页面的地址信息栏,默认通过接口填充了一个已经设置过的一个的默认地址,现在要跳转去地址列表重新选择一个地址并回填到订单页面的地址信息位置 二.尝试 常规操作: 我们通常会将通过接口请求数据的方法放在==created== 或者 ==mounted==这两个生命周期中的一个里面调用. 但是我们知道,

随机推荐