Laravel的生命周期
当你使用一个工具的时候, 如果你对这个工具的内部原理和构造有所了解, 那么在使用这个工具的时候, 就会更加的有信心, 工具用起来也会更加的得心应手.
今天阅读了 Laravel 官方的生命周期文档.
这篇文章可以看做是对官方文档的翻译, 但是也加入了当前我对 Laravel 请求生命周期的理解, 同时也算是加深我对 Laravel 整体架构的印象.
First Things#
首先, 从请求说起, 所有的来自于 web 服务器 ( Apache / Nginx ) 的请求, 都将会被转发到 public/index.php
这个文件处理.
index.php
中代码不多, 但这个文件是一个起始点, 从这个文件开始, Laravel 框架的其余部分就会开始陆续加载了.
同时, index.php
从 bootstrap/app.php
获得了一个实例, 而这也是 Laravel 框架在得到请求之后做的第一件事.
HTTP / Console Kernels#
通过之前得到的这个实例, Laravel 便可以生成处理请求的内核了.
Laravel 本身提供2种内核, HTTP 内核和 Console 内核, 2种内核分别处理不同类型的请求. 我理解的是 HTTP 内核可能是用来处理 HTTP 请求, 而 Console 内核则用来处理控制台中发送来的请求. 文章中暂时只让我们关注于 HTTP 内核, 可能这也是最常用的.
HTTP 内核文件位于 app/Http/Kernel.php
, 继承自 Illuminate\Foundation\Http\Kernel
Kernel 这个 Class.
在 Illuminate\Foundation\Http\Kernel
Kernel Class 中, 定义了一个由 bootstrappers
组成的数组, 会有一个函数遍历数组中的每个 bootstrapper
, 并执行每一个 bootstrapper
. 这些 bootstrappers
在请求被真正的业务逻辑处理之前, 会执行一些包括错误处理, 日志记录, 确定应用环境等配置任务.
HTTP 内核还定义了一个中间件的列表 ( a list of HTTP middleware ), 所有的请求在被处理之前, 都需要先通过这些中间件的处理. 这些中间件可以处理 HTTP session 的读写, 可以判断服务器当前是否处于维护模式, 验证 CSRF token ( 为了保护服务器不受 CSRF 攻击 ) 等等功能.
最后, HTTP 内核最终用于处理请求的方法 ( handle
method) 看起来还是很简单的. 单纯的接受一个 Request
以及 返回一个 Response
.
上面这些概念有的地方也许我现在还无法详细的理解, 想要充分的理解, 就需要去看 Laravel 的源码了. 但是目前这个阶段可以先不需要看源码.
只需要知道, 内核就是一个黑箱, 可以为你提供服务器的所有功能, 而你只需要传给内核 HTTP 请求, 黑箱就会返回 HTTP 响应了.
Service Providers#
在 Kernel Class bootstrappers
数组中, 最重要的 bootstrapper
任务就是载入 service provider
, 这项任务由 RegisterProviders 和 BootProviders 2个 bootstrapper
来完成.
所有的 service provider 都会在 config/app.php
中的 providers
中进行配置. 这些 'providers' 的启动方式是: 首先所有的 provider 都会执行 register 方法, 一旦所有的 provider 都执行完毕 register 方法, boot
方法就会调用.
Service Provider 的作用非常重要, 它会启动框架的所有组件, 包括数据库, 队列, 数据验证, 路由组件等. 也正是由于 Service Provider 启动和配置了所有 Laravel 框架的特性和功能, 所以才让它成为了整个 Laravel 启动过程中最终要的部分.
Dispatch Request#
一旦所有的 bootstrapper
都执行完, 所有的 Service Provider 都注册完之后, 请求终于到达了 router
, router
将会把得到的请求分发给其下一级 ( 通常是一个 controller 或者另一个 router ), 当然如果设置任何 router 相关的 中间件, 中间件也会先执行.
Focus On Service Providers#
官方文档说, 大家一定要把注意力放到 Service Providers 上啊. 毕竟整个 Laravel 的工作流程简单来说就是, 创建一个实例, 注册所有的 Service Provider, 请求就可以开始被处理了.
系统的默认 Service Providers 放在 app/Providers
目录下. 默认情况下, AppServiceProvider
是一个比较空的文件, 如果你想要放置自定义的 初始化任务 或者 绑定一个 service container, 这里就是做这些事情的合适位置.
但是如果对一个大型的项目来说, 创建多个你自己的 Service Provider 也许更好, 从而在每个 Service Provider 中进行粒度更细分的初始化任务.
想知道更多#
Laravel 官方文档: Request Lifecycle
Laravel 学习笔记之 Bootstrap 源码解析
Laravel的生命周期的更多相关文章
- 我所理解的 Laravel 请求 生命周期
转载自:https://laravel-china.org/topics/3343/my-understanding-of-the-laravel-request-life-cycle 当你使用一个工 ...
- 图解Laravel的生命周期
先来张图大致理解下laravel的生命周期. 下面对应相应的代码,解释上图. //文件路径:laravel/public/index.php /** * laravel的启动时间 */ define( ...
- Laravel源码分析--Laravel生命周期详解
一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...
- laravel生命周期和核心思想
工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...
- laravel中的$request对象构造及请求生命周期
laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...
- Laravel 入口文件解读及生命周期
这里只贴index.php的代码, 深入了解的请访问 https://laravel-china.org/articles/10421/depth-mining-of-laravel-life- ...
- [ Laravel 5.5 文档 ] 底层原理 —— 一次 Laravel 请求的生命周期
Posted on 2018年3月5日 by 学院君 简介 当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此.当你理解了开发工具如何工作,用起 ...
- Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)
Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...
- ThinkPHP 5 生命周期
前段时间用TP5开发了一个小程序,就熟悉了一下TP5.TP5是TP框架最新的一个版本,与以前的3还是有很大的区别,有人说和laravel比较靠近,其实也还好,每个人都有自己不同的看法,只要是选择一个自 ...
随机推荐
- Clion cmake 一个简单的 C++ 程序
CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(dll) set(CMAKE_CXX_FLAGS "${CMAKE_CX ...
- OpenGL Tutorial
https://open.gl https://www.processing.org/tutorials/pshader/
- 数据库实现多站点共享Session
数据库实现多站点共享Session 多站点共享Session有很多方法,多站点共享Session常见的做法有: 使用.net自动的状态服务(Asp.net State Service); 使用.net ...
- EF批量插入 扩展
https://efbulkinsert.codeplex.com/ https://github.com/loresoft/EntityFramework.Extended
- Mac添加bash alias
1. vim ~/.bash_profile (无则新建) 添加 if [ -f ~/.bashrc ]; then source ~/.bashrcfi 2.vim ~/.bashrc (无则新建) ...
- PuzzleGame部分核心算法
#include "mainwindow.h" #include <QGridLayout> #include <QPushButton> #i ...
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已.我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的. ...
- MySQL中MAX函数与Group By一起使用的注意事项(转)
mysql> select * from test; +----+-------+------+-------+ | id | name | age | class | +----+------ ...
- sql server 得到数据库字典
SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a. ...
- 弹出框三 之 sweetalert
1下载sweetalert 2.引入到项目中 <link href="~/Content/sweetalert.css" rel="stylesheet" ...