[Laravel] Laravel 请求的生命周期

   2016-12-06 0
核心提示:当你使用一个工具的时候, 如果你对这个工具的内部原理和构造有所了解, 那么在使用这个工具的时候, 就会更加的有信心, 工具用起来也会更加的得心应手。今天阅读了 Laravel 官方的生命周期文档. 这篇文章可以看做是对官方文档的翻译, 但是也加入了当前我对 Lara

当你使用一个工具的时候, 如果你对这个工具的内部原理和构造有所了解, 那么在使用这个工具的时候, 就会更加的有信心, 工具用起来也会更加的得心应手。

今天阅读了 Laravel 官方的 生命周期文档 . 这篇文章可以看做是对官方文档的翻译, 但是也加入了当前我对 Laravel 请求生命周期的理解, 同时也算是加深我对 Laravel 整体架构的印象。

First Things

首先, 从请求说起, 所有的来自于 web 服务器 ( Apache / Nginx ) 的请求, 都将会被转发到 public/index.php 这个文件处理。

index.php 中代码不多, 但这个文件是一个起始点, 从这个文件开始, Laravel 框架的其余部分就会开始陆续加载了.

同时, index.phpbootstrap/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
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • nginx 各类网站设置 (laravel , thinkphp , nod
    基础部分设置[root@centos ~]# vim /opt/nginx/conf/nginx.confuser www www;worker_processes auto;pid logs/nginx.pid;worker_rlimit_nofile 100000;events {use epoll;multi_accept on;worker_connections 65535 ;}http {include mime.types;default_type
    02-09
  • PHP trait 特性在 Laravel 中的使用个人心得
    trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 laravel 的使用请参看 Laravel 在哪些地方用了 trait?我曾在 Laravel 中大型项目面向
    02-09
  • 让我们用 laravel-mix 为 TypeScript 和 Sass
    介绍前端编译TypeScript、Sass、模板引擎等时经常用到Gulp和webpack。这是我个人的印象,但它们似乎都难以管理,因为它们的描述往往复杂而冗长。我不想积极进行,因为我要担心加载器的顺序并且有很多配置选项,我必须花时间去了解它们。我想推荐那里laravel
  • PHP Laravel软删除的实现方法介绍
    用Laravel 自带的 Eloquent ORM 来实现软删除。首先在数据迁移文件中添加删除时间字段./database/migrations/2014_10_12_000000_create_users_table.php?phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illu
  • Laravel中如何使用PHP的装饰器模式 php laravel
    本文小编为大家详细介绍“Laravel中如何使用PHP的装饰器模式”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel中如何使用PHP的装饰器模式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。装饰器模式定义:它可以帮助您在
    02-08 laravelphp
  • PHP laravel使用自定义邮件类实现发送邮件
    PHP laravel使用自定义邮件类实现发送邮件
    当登录邮箱为腾讯企业邮箱的时候。Phpmailer发送邮件就不好用了,具体哪里不好用,我没真没找到。但是,邮件得发啊,怎么办呢?我这里搞了一个自定义的发送邮件类,腾讯企业邮箱也可用。但是,邮件发送失败,不会返回报错信息,这个可能是有点坑。源码如下:?
  • 详解PHP laravel中的加密与解密函数
    目录一:简介二:配置三:使用加密/解密1:加密2:不使用序列化进行加密3:解密Laravel为我们提供了完整的加密方法及加密模式。我之前一般在加密的时候使用的是我自己写的加密函数,但是这个玩意,有的位置还是不太使用,当然,破解的话,基本上也是不可能的
  • PHP laravel缓存cache机制详解
    目录一、访问多个缓存存储二、从缓存中获取数据1.获取数据并设置默认值2.检查缓存项是否存在3.数值增加/减少4.获取存储5.获取删除三、缓存中存储数据1.获取存储数据2.缓存不存在时存储数据3.永久存储数据四、从缓存中移除数据Laravel中的cache为我们提供了三
  • PHP laravel实现导出PDF功能
    PHP laravel实现导出PDF功能
    目录一、laravel-tcpdf二、tcpdf三、TCPDF解决保存中文文件名的方法补充一、laravel-tcpdf导出PDF文件Laravel框架为我们集成了一个插件tcpdf。下载地址:https://github.com/elibyy/tcpdf-laravel然后使用composer进行安装就可以了。具体安装过程,请查看文末
  • PHP laravel缓存cache机制怎么实现
    今天小编给大家分享一下PHP laravel缓存cache机制怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Laravel中的cache为我们
点击排行