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 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
Jun 29 PHP
php中autoload的用法总结
Nov 08 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 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开发GUI
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
python mock测试的示例
2020/10/19 Python
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
护士检查书
2014/01/17 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
倡议书格式
2014/08/30 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
特此通知格式
2015/04/27 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
MySQL导致索引失效的几种情况
2022/06/25 MySQL