包头SEO:目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录

首先看入口 index.php

关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大知识点。

进入

require_once __DIR__.'/../bootstrap/app.php';

发现 $app初始化了Application对象

$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

紧接着有一个关键操作 singleton

$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
); $app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
); $app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);

这里的单例,将抽象类绑定给了实体类

包括后面 index.php 里面马上在make方法中用到的

因此$kernel 得到的是 App\Http\Kernel::class 的实例对象。

继续看后面

$kernel执行handle

App\Http\Kernel::class 继承了

Illuminate\Foundation\Http\Kernel

因此执行的是

我们关键留意

sendRequestThroughRouter 方法

这里的首先将 $request 注册到公共容器中

through 方法会将原本定义在 App\Http\Kernel::class 里面的 中间件
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
//\App\Http\Middleware\Api\V1\Statistics\Common\CommonStatisticsMiddleware::class
];

成员变量注入到管道中,

->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)

通过array_reduce 方法会依次将中间件中handle方法执行

最后执行 $this->dispatchToRouter();

可能有些朋友不解了

按照array_reduce方法不是将

$this->prepareDestination($destination)

首先执行吗,这个也的确没毛病,关键是这个prepareDestination 只是作为一个预加载的作用,执行后返回的是一个后调函数,回调函数里面才是我们前面提到的$this->dispatchToRouter() , 因此它会被注入到管道的最底部,将倒序之后的中间件执行注入之后,最后得到的就是 首个中间件的

Closure 闭包方法。

最后一步,将这个闭包执行,就可以依次执行中间件的验证,和dispatchToRouter方法了

浅析laravel路由执行原理的更多相关文章

  1. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

  2. 原来 laravel 路由 参数可以为可选。。。 很灵活

    基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Rout ...

  3. MQ系列:消息中间件执行原理

    1 关于消息中间件 1.1 什么是消息中间件? 消息中间件是指在分布式系统中完成消息的发送和接收的基础软件. 消息中间件也可以称消息队列(Message Queue / MQ),用高效可靠的消息传递机 ...

  4. laravel路由基础

    基础: 所有的laravel路由都定义在 app/Http/routes.php 这个文件里,会被框架自带加载.简单的路由会接受一个URI和一个Closure类. Route::get('foo', ...

  5. Javascript之数据执行原理探究

    Javascript在Web服务器端执行原理: 1.客户端请求数据,即我们在上网时在地址栏中输入某个网址,浏览器接收到数据之后,向远程web服务器发送请求报文. 2.web服务器响应请求,web服务器 ...

  6. Python程序的执行原理(转载)

    Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc  1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...

  7. smarty模板执行原理

    为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开 ...

  8. MapReduce调度与执行原理之任务调度

    前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...

  9. MapReduce调度与执行原理之作业提交

    前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...

随机推荐

  1. cf 758D - Ability To Convert

    从后往前贪心就好了.各种各样0的情况太BT了.. (各种爆long long,f**k) #include<bits/stdc++.h> #define LL long long #def ...

  2. SQL约束攻击

    本文转载自https://blog.csdn.net/kkr3584/article/details/69223010 目前值得高兴的是,开发者在建立网站时,已经开始关注安全问题了--几乎每个开发者都 ...

  3. Tensorflow学习教程------过拟合

    Tensorflow学习教程------过拟合   回归:过拟合情况 / 分类过拟合 防止过拟合的方法有三种: 1 增加数据集 2 添加正则项 3 Dropout,意思就是训练的时候隐层神经元每次随机 ...

  4. Java执行js加密算法

    Java执行js加密算法 今日需求:在后端执行一段加密算法,算法是js写的 明白需求以后疯狂百度.最后发现JDK提供了各种脚本的支持(怪笔者学艺不精,第一次见识到这个库,留下不学无术的泪水),正题开始 ...

  5. SPOJ 3883. LATGACH3/ UVA 10918

    用1*2的方块去覆盖3*n的方块 http://www.cnblogs.com/staginner/archive/2011/12/16/2290020.html 玉斌大神的题解 其实我昨晚想得跟斌神 ...

  6. Bugku web(1—35)

    1.web2 打开网页: 哈哈,其实按下F12你就会发现flag. 2.计算器 打开网页,只是让你输入计算结果,但是发现只能输入一个数字,这时按下F12,修改一下参数,使之可以输入多个数字,修改后输入 ...

  7. PAT Advanced 1106 Lowest Price in Supply Chain (25) [DFS,BFS,树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...

  8. 多种类型SQL注入

    前言 发现MYSQL手注注入方式用得多了,几乎都快忘记其它数据库注入的方式了,这里不讲绕过姿势和写shell,毕竟网上很多前辈都给了方法,我只讲一些基本的注入方式(只是记录一下各自的特性,记下来方便以 ...

  9. elasticsearch-logstash

    1.logstash介绍 logstash 是ES 下的一款开源软件.用于数据采集,就是从Mysql等数据源采集数据.更新数据.然后将数据发送到ES中创建.更新索引 2.安装 演示环境是windows ...

  10. inotifywait命令详解及安装

    https://www.cnblogs.com/pyrene/p/6414724.html     安装 https://www.cnblogs.com/martinzhang/p/4126907.h ...