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开发大型项目的一点经验
Oct 09 PHP
php初学者写及时补给skype用户充话费的小程序
Nov 02 PHP
php结合飞信 免费天气预报短信
May 07 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
Jun 23 PHP
PHP定时执行任务的3种方法详解
Dec 21 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php命名空间学习详解
2014/02/27 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
php图片裁剪函数
2018/10/31 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
Django使用中间键实现csrf认证详解
2019/07/22 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
营销计划书
2015/01/17 职场文书
扬州个园导游词
2015/02/06 职场文书
针对吵架老公保证书
2015/05/08 职场文书
创业计划书之家教托管
2019/09/25 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
golang中的并发和并行
2021/05/08 Golang
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
python小型的音频操作库mp3Play
2022/04/24 Python