laravel中的$request对象构造及请求生命周期
laravel应用程序中index.php是所有请求的入口。当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据,
生成一个request对象,该对象再传入routing系统寻址到对应的controller,最终由controller形成response返回给浏览器,完成整个网页请求的生命周期。
$kernel->handle $request=Illuminate\Http\Request::capture->createFromBase->createFromGlobals->
$request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);(Symfony\Component\HttpFoundation\Request::createRequestFromFactory)
$response = $this->sendRequestThroughRouter($request); Kernel.php(Illuminate\Foundation\Http\Kernel)
$this->app['events']->fire('kernel.handled', [$request, $response]);
return $response;
response->send();
从上面的简单分析可以看出,laravel中的请求生命周期分为三个部分:
1. 一个HTTP请求被routed到一个controller(request对象本身的生成过程如上面所描述)
2. controller执行特定的action访问数据库获取数据按照商业逻辑处理后返回到View;
3. View本身将数据做格式化,最终提供HTTP的response到浏览器

虽然大体过程如上面描述,但是除此之外,也有很多异常流程并未提及。一个request的整个生命周期可以分为三个部分: Loading, Booting, Running.
loading steps:

有三个你的应用能够影响loading步骤的三个区域:
1)workbench: workbench允许你开发和调试一个package
2)你可以修改bootstrap/strat.php并且增加你的应用环境检测;
3)你可以修改bootstrap/paths.php来定制你的应用路径
Booting steps

有10个你的应用可以影响到booting steps的不同区域:
1. configuration:你的应用配置影响到boot process和laravel的运行;
2.service providers:任何你创建的service provider都将在boot process的早期加载到应用中。如果你的service provider 不被deferred,那么他的register()方法将在这时调用;
3.registering the strat files.你的三个application startup file将在应用的booted 事件发生时被加载
4.handle middleware going down
5.booting service providers, 这时所有non-deferred service provider的boot()函数被调用
6.booting callbacks. 任何使用APP::booting()函数注册的callbacks将被调用
7.booted callback. 既然应用已经booted了,那么任何使用App::booted()函数注册的回调将被调用。这包括在第三步中用于加载三个application startup文件的callback
8.Your application start script被调用。这时app/start/globals.php文件。这时任何你希望你的应用在任何request被处理之前所调用的。
9.app/start/{environment}.php如果你需要在特定环境下初始化的代码可以放到这里。
10.app/routes.php:你的应用程序的路由。
running steps

1.Maintenance mode:如果你有一个maintenance mode侦听函数被注册了,那么你的listener将在此运行;
2.App "before" filter:
如果你有任何用App::before()来注册的filter,那么他们在此运行;
3.Route/Controller "before"filters
如果你有任何在route或者controller level的before filter,则在此运行;
4.action:
这里是一个controller method或者一个route callback当处理请求是被调用;
5.Route/Controller "after" filters:如果你有route或者controller level的after filter,则在这里被调用;
6.App "after" filters.
如果你有任何使用App::after()函数注册的filter,则在这里调用。任何一个middleware可以在response被返回前来修改它;
7.middleware repsponse handling:
8. middleware shtdown.如果你提供了一个实现了TerminableInterface的middleware,则他的shutdown()
9.Finish callbacks:
如果你有App::finish()注册的callback,则这时调用;
10.shutdown callbacks。最后,如果你有使用App::shutdown()注册的callback则这时调用
http://laravel-recipes.com/recipes/52/understanding-the-request-lifecycle
laravel中的$request对象构造及请求生命周期的更多相关文章
- Spring拦截器中通过request获取到该请求对应Controller中的method对象
背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置.我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control ...
- [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]
[Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...
- 在SpringMVC中获取request对象
1.注解法 @Autowired private HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...
- 在SpringMVC中获取request对象的几种方式
1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...
- 如何在SpringMVC中获取request对象
1.注解法 @Autowired private HttpServletRequest request; <listener> <listener-class> org.spr ...
- urllib2特点--urllib2.Request对象,定制请求头部信息
# -*- coding: cp936 -*- #python 27 #xiaodeng #urllib2特点--urllib2.Request对象,定制请求 import urllib2 def r ...
- 我所理解的 Laravel 请求 生命周期
转载自:https://laravel-china.org/topics/3343/my-understanding-of-the-laravel-request-life-cycle 当你使用一个工 ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- request请求生命周期
request请求生命周期 一.request请求分析 1.1. request数据请求 # views.py from rest_framework.views import APIView fro ...
随机推荐
- .NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 (在IIS7.5中的设备办法)
.NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 在IIS中新建网站(端标语8111) 直接运行http://localhost:8111/ 设备办法: 二.添加通配符脚本映 ...
- 各大Oj平台介绍
1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的在线提交系统(OnlineJudge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有P ...
- vi/vim使用指北 ---- Sample Editing
本篇介绍vim的基础操作,各种编辑模式的切换,光标的移动,删除,撤销/重做,保存,查找等基础命令: 基础操作 编辑文件 vim [options] [file ...] 模式 打开文件后进入vim的 ...
- 在线API文档
http://www.ostools.net/apidocs A Ace akka2.0.2 Android Ant Apache CXF Apache HTTP服务器 ASM字节码操作 AutoCo ...
- css系列-间隔与间距实例
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别 ...
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
题目链接 题意 : 给你n个初值,然后进行两种操作,第一种操作是将(L,R)这一区间上所有的数变成x,第二种操作是将(L,R)这一区间上所有大于x的数a[i]变成gcd(x,a[i]).输出最后n个数 ...
- Java 网络编程(二)
以下例开始本文的内容: 例1,需求:上传图片. 客户端: 服务端点. 读取客户端已有的图片数据. 通过socket输出流将数据发给服务端. 读取服务端反馈信息. 关闭. class PicClient ...
- mfc和win32区别
Win32通常是指sdk编程方法,app没有被封装,开发人员需要自己搭程序框架:mfC则是以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量 (整理 ...
- 【ArcEngine入门与提高】Element(元素)、Annotation(注记)旋转
因项目需要,需要做一个旋转注记的工具.因为注记这玩意用的比较少,网上资源也很少,所以做起来相当头疼.在经过一番研究之后,终于搞清楚注记的存储原理了,原来是和Element的类似,只不过注记是要把Ele ...