• laravel框架基础(2)---laravel项目加载机制


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

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

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

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

      

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

      

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

       

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

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

      bootstrap/app.phpapplication创建的时候会做到事情

         

         不过这里要注意Application是继承与IlluminateContainerContainer

           

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

      应用绑定到容器中 registerBaseBindings

      注册所用的应用服务器 registerBaseServiceProviders

      注册核心容器别名 registerCoreContainerAliases

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

       

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

      在vendorlaravelframeworksrcIlluminateContainerContainer.php$instances中绑定着laravel所需要的一些共享的实例

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

      

      所在registerBaseBindings中就会先把我ApplicationContainer事先绑定为共享实例

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

       

      

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

       

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

      

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

      

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

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

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

      

      index.php当执行make方法的时候这个地方注意获取到的是AppHttpKernel 

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

      vendorlaravelframeworksrcIlluminateContainerContainer.php 中的resolve 方法也就是容器解析的方法

      

      在这个方法中

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

        所以最终解析出AppHttpKernel ,回到index.php

      

      因为Hernel是继承与IlluminateFoundationHttpKernel

       

      所以我们打开IlluminateFoundationHttpKernel查看handle方法

      

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

      重点我们需要关注的是sendRequestThroughRouter

        

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

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

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

      而执行的中间件就在AppHttpKernel中的$middleware定义好

      

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

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

      

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

  • 相关阅读:
    Docker学习重点(5)~Docker镜像原理、commit提交镜像
    Docker学习重点(6)~容器数据卷
    Linux安装RocketMQ
    4.1 打包和压缩的概念和区别
    4.3 Linux压缩文件或目录为.zip格式(zip命令)
    3.21 Linux PATH环境变量及作用(初学者必读)
    4.6 Linux解压.gz格式的文件(gunzip命令)
    4.4 Linux解压.zip格式的文件(unzip命令)
    3.18 Linux懒人神器:命令自动补全功能!
    4.5 Linux压缩文件或目录中文件为.gz格式(gzip命令)
  • 原文地址:https://www.cnblogs.com/mjhblog/p/10191640.html
Copyright © 2020-2023  润新知