laravel中的$request对象构造及请求生命周期

时间:2021-09-21 09:32:06

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到浏览器

laravel中的$request对象构造及请求生命周期

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

loading steps:

laravel中的$request对象构造及请求生命周期

有三个你的应用能够影响loading步骤的三个区域:

1)workbench: workbench允许你开发和调试一个package

2)你可以修改bootstrap/strat.php并且增加你的应用环境检测;

3)你可以修改bootstrap/paths.php来定制你的应用路径

Booting steps

laravel中的$request对象构造及请求生命周期

有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

laravel中的$request对象构造及请求生命周期

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对象构造及请求生命周期的更多相关文章

  1. Spring拦截器中通过request获取到该请求对应Controller中的method对象

    背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置.我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control ...

  2. [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]

    [Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...

  3. 在SpringMVC中获取request对象

    1.注解法 @Autowired private  HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...

  4. 在SpringMVC中获取request对象的几种方式

    1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...

  5. 如何在SpringMVC中获取request对象

    1.注解法 @Autowired private HttpServletRequest request; <listener> <listener-class> org.spr ...

  6. urllib2特点--urllib2&period;Request对象,定制请求头部信息

    # -*- coding: cp936 -*- #python 27 #xiaodeng #urllib2特点--urllib2.Request对象,定制请求 import urllib2 def r ...

  7. 我所理解的 Laravel 请求 生命周期

    转载自:https://laravel-china.org/topics/3343/my-understanding-of-the-laravel-request-life-cycle 当你使用一个工 ...

  8. DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render

    DRF框架    全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...

  9. request请求生命周期

    request请求生命周期 一.request请求分析 1.1. request数据请求 # views.py from rest_framework.views import APIView fro ...

随机推荐

  1. 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署

    少啰嗦,直接装 看过上一篇分布式文件系统 - FastDFS 简单了解一下的朋友应该知道,本次安装是使用目前余庆老师开源的最新 V5.05 版本,是余庆老师放在 Github 上的,和目前你能在网络上 ...

  2. web前端之HTML的大框架(body元素与frameset元素)

    web前端之HTML的大框架      body元素与frameset元素 对于从事html的人员来说,我们一般熟悉的框架是先声明html ,然后在<html>标签对里包着<head ...

  3. 找回忘记的Ubuntu用户名和密码

    找回忘记的Ubuntu用户名和密码 前端时间使用VMWare安装了个Ubuntn的虚拟机,但是烦于安装后显卡驱动的问题,看着操作界面就有点厌烦,就扔下了.今天打开虚拟机登陆的时候忘了密码,寻思着难道要 ...

  4. 6&period; ZigZag Conversion

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  5. webBrowser1执行函数

    IHTMLWindow2 Win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;string s = "alert('x');& ...

  6. CSS3实现页面的平滑过渡

    这是文件的css,全部文件的话请到Github下载:点击这里 @charset "UTF-8"; @font-face {font-family: 'iconfont'; src: ...

  7. TCP连接的建立(二)

    被动打开 SYN cookies TCP协议开辟了一个比較大的内存空间请求连接队列来存储连接请求块,当SYN请求不断添加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求.SYN cookies技 ...

  8. springBoot中实现自定义属性配置、实现异步调用、多环境配置

    springBoot中其他相关: 1:springBoot中自定义参数: 1-1.自定义属性配置: 在application.properties中除了可以修改默认配置,我们还可以在这配置自定义的属性 ...

  9. 高并发秒杀系统方案(分布式session)

    编程要有一个习惯:做参数校验 所谓的分布式session:就是用redis统一管理session. 我们这里的思路是:把token写入cookie中,客户端在随后的访问中携带cookie,服务端就能根 ...

  10. Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)

    Python 的内建标准类型有一种分类标准是分为可变类型与不可变类型: 可变类型:列表.字典 不可变类型:数字.字符串.元组 因为变量保存的实际都是对象的引用,所以在给一个不可变类型(比如 int)的 ...