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


Posted in PHP onOctober 15, 2014

概述

在现实世界中使用工具时,如果理解了工具的工作原理,使用起来就会更加有底气。应用开发也是如此。当你理解了开发工具是如何工作的,使用起来就会更加自如。这篇文档的目标就是提供一个高层次的概述,使你对于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 事件,如果想在脚本结束前再做一些事情,这是最后的机会。不过在大多数情况下,你都不需要用到这些事件。

PHP 相关文章推荐
php 变量定义方法
Jun 14 PHP
apache mysql php 源码编译使用方法
May 03 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
php遍历目录下文件并按修改时间排序操作示例
Jul 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
跟我学Laravel之配置Laravel
Oct 15 #PHP
跟我学Laravel之安装Laravel
Oct 15 #PHP
跟我学Laravel之快速入门
Oct 15 #PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 #PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 #PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 #PHP
php保存二进制原始数据为图片的程序代码
Oct 14 #PHP
You might like
php数组的概述及分类与声明代码演示
2013/02/26 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python实现自动登录
2018/09/17 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
司机的工作范围及职责
2013/11/13 职场文书
教师队伍管理制度
2014/01/14 职场文书
护理不良事件检讨书
2014/02/06 职场文书
元宵节主持词
2014/03/25 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
公司租房协议书范本
2014/10/08 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python