当我们,通过浏览器请求laravel的时候 laravel就会根据我们的请求链接来选择对应的方法执行并返回我们所需要的实际结果。

那么这个过程是怎样的呢?

1.生命周期 2018-12-28 17:03:52[作者:struggler]

  首先当我们通过访问laravel的时候,这个时候就会进入public/index.php中。

  

  在index.php中通过composer进行依赖管理,然后通过bootstrap/app.php来获取我们所需要的Illuminate\Foundation\Application类也就是应用实例。

  

  获取到应用实例Application之后,通过调用make方法解析出Http请求执行对象,然后调用handle方法执行用户的 请求,并返回出response的实例

   

  通过send吧用户执行的结果响应输出,并停止在执行过程中所运行的中间件。

2.应用实例创建与基础应用相关注册 2018-12-28 17:03:52[作者:struggler]

  bootstrap/app.php中application创建的时候会做到事情

     

     不过这里要注意Application是继承与Illuminate\Container\Container

       

  可以很明显的发现首先会对于基础的

  应用绑定到容器中 registerBaseBindings

  注册所用的应用服务器 registerBaseServiceProviders

  注册核心容器别名 registerCoreContainerAliases

  其实这个过程还有一个就是设置程序的路径

   

  在registerBaseBindings 方法中首先我们会吧application设置为全局共享。

  在vendor\laravel\framework\src\Illuminate\Container\Container.php中$instances中绑定着laravel所需要的一些共享的实例。

  而这些实例就可以通过instance方法进行绑定

  

  所在registerBaseBindings中就会先把我Application与Container事先绑定为共享实例。

  而registerBaseServiceProviders则是对于基础服务注册主要是事件,日志与路由

  

  

  而在每一个服务中都通会通过register对于对应服务通过Container中的singleton绑定在Illuminate\Container\Container中的$bindings属性中

   

  当对应的基础服务注册之后就会把系统核心类库别名注册

  

  然后返回Application实例,在bootstrap/app.php中把Http,Console异常核心类库注册

  

  Application在初始化的时候对于laravel所需要核心类库进行别名注册,以及服务注册

3.服务解析与Http中间件 2018-12-28 17:03:52[作者:struggler]

  之前已经讲解了index.php中的执行流程。那么接下来简单解释服务于中间件中间的加载。

  

  index.php中。当执行make方法的时候这个地方注意获取到的是App\Http\Kernel类 

  这个时候就会执行到Application中的make方法 ,通过方法的跳转跟踪最终会执行到

  vendor\laravel\framework\src\Illuminate\Container\Container.php 中的resolve 方法也就是容器解析的方法

  

  在这个方法中

    1. 首先会先去获取是否存在对应的别名 通过getAlias
    2. 然后检查传递的实例是否有绑定
    3. 然后就会从$instances中获取对应的共享实例,而如果没有则会去解析
    4. 这个时候就会通过getConcrete获取之前 通过Application中registerBaseServiceProviders方法注册在Container->$bindings 中的服务

    所以最终解析出App\Http\Kernel类 ,回到index.php中

  

  因为Hernel是继承与Illuminate\Foundation\Http\Kernel

   

  所以我们打开Illuminate\Foundation\Http\Kernel查看handle方法

  

  enableHttpMethodParameterOverride方法开启方法参数覆盖,既可以在POST请求中添加_method参数伪造HTTP方法

  重点我们需要关注的是sendRequestThroughRouter

    

  在这个方法中就是执行用户的请求

  我们可以看到在方法中调用了Pipeline

  Pipeline是Laravel的管道操作类。而实际上中间件的实现的核心就是Pipeline。在这里发送一个$request对象通过middleware中间件数组

  而执行的中间件就在App\Http\Kernel中的$middleware定义好

  

  所以在项目启动的时候就会执行,这些中间件处理 HTTP 会话 读写、判断应用是否处于维护模式、 验证 CSRF 令牌 等等。

  HTTP 内核的 handle 方法签名相当简单:获取一个 Request ,返回一个 Response。以把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

  

  最后返回出Response对象并输出结果,终止中间件

laravel框架基础(2)---laravel项目加载机制的更多相关文章

  1. 插件化框架解读之so 文件加载机制(四)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 提问 本文的结论是跟着 System.loadlibrary() ...

  2. Java基础_类的加载机制和反射

    类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...

  3. 插件化框架解读之Android 资源加载机制详解(二)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680Android提供了一种非常灵活的资源系统,可以根据不同的条件提供 ...

  4. Crystal框架配置参数加载机制详解?

    前言 定义 配置参数定义的形式 配置参数文件定义在哪里? 配置参数加载的优先级 如何使用配置参数? 最佳实践 Jar项目中如何定义配置参数? War项目中如何定义或重载Jar包中的配置参数? 开发人员 ...

  5. Laravel 学习笔记之 Composer 自动加载

    说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制. Composer的自动加载机制 1.初始化一个composer项目 在一个空目录下compose ...

  6. 如何基于Winform开发框架或混合框架基础上进行项目的快速开发

    在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...

  7. abp web.mvc项目中的菜单加载机制

    abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样,它是在编写代码的时候配置,而我们一般写的通用权限管理系统中,是后期在后台界面中添加的.这一点有很大不同.abp关于菜单的定义及管理 ...

  8. VS2012 VS2015打开项目加载失败

    VS2012 VS2015打开项目加载失败 改成这个$(MSBuildToolsVersion)试试

  9. django之创建第12个项目-加载图片

    百度云盘:django之创建第12个项目-加载图片 1.setting配置 #静态文件相关配置 # URL prefix for static files. # Example: "http ...

随机推荐

  1. Smart Link

    Smart Link通过两个接口相互配合工作来实现功能.这样的一对接口组成了一个Smart Link组.为了区别一个Smart Link组中的两个接口,我们将其中的一个叫做主接口,另一个叫做从接口.同 ...

  2. mtr命令详解诊断网络路由

    首先安装mtr​# yum -y install mtr ​ ​一般在windows 来判断网络连通性用ping 和tracert, ping的话可以来判断丢包率,tracert可以用来跟踪路由, 在 ...

  3. python -- ajax数组传递和后台接收

    phper转pythoner 在当初使用php做网站开发的时候,前端ajax传递数据的时候,就是直接将一个数组传递过去,后台用$_POST['key']接收即可,没有考虑那么细,想来这不都是理所当然的 ...

  4. PowerDesigner 中模型设计导出Excel表格

    今天项目做设计,客户要看数据设计,需要到处Excel表格.去网上搜索下,把使用总结如下: 已经完成设计的pd设计 打开pd,快捷键Ctrl + Shift + X或者Tools>Exectue ...

  5. Houdini技术体系 基础管线(四) :Houdini驱动的UE4植被系统 上篇

    背景 之前在<Houdini技术体系 过程化地形系统(一):Far Cry5的植被系统分析>一文中已经对AAA游戏中过程化植被的需求有了一定的定义,后续工作就是如何用Houdini开发功能 ...

  6. 81For全栈技术网

    你想了解前端吗? 你想了解后端吗? 你想了解设计吗? 81For全栈技术这里包含了互联网所有内容,81For.com是全栈技术网,包括:前端.后端.全栈.jquery.vue.react.router ...

  7. 高仿QQ、微信效果的图片浏览器(支持原图和缩略图、多种手势、CocoaPods)

    感谢原文作者的分享 本文转载至 http://my.oschina.net/u/2406027/blog/735738 PYPhotoBrowser GitHub地址:https://github.c ...

  8. 机器人学 —— 机器人感知(Location)

    终于完成了Robotic SLAM 所有的内容了.说实话,课程的内容比较一般,但是作业还是挺有挑战性的.最后一章的内容是 Location. Location 是 Mapping 的逆过程.在给定ma ...

  9. Excel条件格式

    任务需求,将Excel中年龄为90后出生的人员筛选出来,并将重复的人员数据删除. 一.Excel去重 选中表格数据->数据->删除重复值 此时弹出对话框,选择去重列. 点击确定即可. 二. ...

  10. flask将日志写入日志文件

    import logging logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别 filename='log_new.log', # 将日志写入lo ...