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.MVC的模板标签系统(五)
Sep 05 PHP
杏林同学录(九)
Oct 09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
php 数学运算验证码实现代码
Oct 11 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
PHP之COOKIE支持详解
Sep 20 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
php实现图片上传、剪切功能
May 07 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 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搭建聊天室功能实例代码
2012/08/20 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
JavaScript 面向对象之命名空间
2010/05/04 Javascript
js 函数调用模式小结
2011/12/26 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
requireJS使用指南
2016/04/27 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
python属于跨平台语言码
2020/06/09 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
结构工程个人自荐信范文
2013/11/30 职场文书
运动会方队口号
2014/06/07 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python