laravel 框架执行流程与原理简单分析


Posted in PHP onFebruary 01, 2020

本文实例讲述了laravel 框架执行流程与原理。分享给大家供大家参考,具体如下:

1.index.php

$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);

2.进入app.php

$app = new Illuminate\Foundation\Application(
  $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
$app->singleton(
  Illuminate\Contracts\Http\Kernel::class,
  App\Http\Kernel::class
);

Application 类绑定基本类到容器

Kernel 类执行路由分发加载控制器等操作

3.进入 Kernel.php

// 全局路由中间件,每次执行都会执行
protected $middleware = [];
// 中间件路由分组,
protected $middlewareGroups = [];
// 中间件别名,可以单独使用也可以分配给组
protected $routeMiddleware = [];
// 中间件排序
protected $middlewarePriority = [];

kernel 类继承 Illuminate\Foundation\Http\Kernel 类

4.进入 Illuminate\Foundation\Http\Kernel 类

//http方法参数覆盖,也就是 X-HTTP-METHOD-OVERRIDE 中有参数,就按照这个里面的走,如果没有,那就是post
$request->enableHttpMethodParameterOverride();
// 通过中间件/路由器发送给定的请求。
$response = $this->sendRequestThroughRouter($request);
// 触发事件并呼叫听众 韩注:触发观察者
$this->app['events']->dispatch(
new Events\RequestHandled($request, $response)
);
return $response;

进入 sendRequestThroughRouter 方法

// 注册请求类到容器中
 $this->app->instance('request', $request);
// 从facade根实例 中删除共享实例
Facade::clearResolvedInstance('request');
// 启动引导类  protected $bootstrappers = []; 引导类都在这个数组中
$this->bootstrap();
// 通过管道模式执行最终结果,切面编程,aop 
 return (new Pipeline($this->app))
          // 设置通过管道发送的对象
          ->send($request)
          // 设置管道阵列。
          // shouldSkipMiddleware  判断是否应该跳过中间件,$this->make('middleware.disable') 设置为true
          // $this->bound('middleware.disable') 设置为true 应该可以跳过 所有中间件,不知道这么做的好处是什么?
          ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
          // 使用最终目标回调运行管道,最终需要运行的结果
          ->then($this->dispatchToRouter());

进入 dispatchToRouter 路由分发 ,最终由路由类中 dispatch 执行路由,并实现注入

$this->router->dispatch($request);

利用反射原理实现依赖注入 Illuminate\Container\Container 类中

public function make($abstract, array $parameters = []){
  return $this->resolve($abstract, $parameters);
}
public function build($concrete)
// build 中
$reflector = new ReflectionClass($concrete);

依赖注入通过 $parameter->getClass() 知道是什么类

class Demo{
  public function store(Request $req333, $abc){
  }
}
class Request{}
$method = new ReflectionMethod('Demo', 'store');
foreach ($method->getParameters() as $parameter) {
  // 获取参数的限制类的类型
  $param_type = $param->getClass(); //获取当前注入对象的类型提示
  $param_value = $param->getName(); //获取参数名称
  if ($param_type) {
    // 通过类的类型限制名称中提取容器中的实例
    $avgs[] = $app[$param_type->name];
  }
}
$reflect->invokeArgs($app['demo'], $avgs);

X-HTTP-METHOD-OVERRIDE 可以覆盖laravel的请求,比如实现restful请求,像put delete 等特殊的请求

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php 调试利器debug_print_backtrace()
Jul 23 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
9个比较实用的php代码片段
Mar 15 PHP
php中类和对象:静态属性、静态方法
Apr 09 PHP
PHP中include和require的区别实例分析
May 07 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 #PHP
php正则表达式使用方法整理集合
Jan 31 #PHP
laravel邮件发送的实现代码示例
Jan 31 #PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 #PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 #PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 #PHP
Laravel框架自定义分页样式操作示例
Jan 26 #PHP
You might like
php实现Mysql简易操作类
2015/10/11 PHP
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
vue中tab选项卡的实现思路
2018/11/25 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
了解重排与重绘
2019/05/29 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python将视频转换为全字符视频
2019/04/26 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
商场消防管理制度
2014/01/12 职场文书
退休感言
2014/01/28 职场文书
农林环境专业求职信
2014/03/13 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
竞聘演讲稿怎么写
2014/08/28 职场文书
高中学校对照检查材料
2014/08/31 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers