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 数组遍历的差异(array_diff 的实现)
Mar 23 PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
如何用php获取程序执行的时间
Jun 09 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
php简单操作mysql数据库的类
Apr 16 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
css图片自适应大小
2007/11/28 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
JS模板实现方法
2013/04/03 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
jquery获取节点名称
2015/04/26 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
利用ES6语法重构React组件详解
2017/03/02 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Win8下python3.5.1安装教程
2020/07/29 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
django model object序列化实例
2020/03/13 Python
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
公司应聘自荐书
2014/06/14 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
鸦片战争观后感
2015/06/09 职场文书
运动会广播稿50字
2015/08/19 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
2022漫威和DC电影上映作品
2022/04/05 欧美动漫