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定时自动生成静态HTML的实现代码
Jun 20 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
PHP基础知识回顾
Aug 16 PHP
VIM中设置php自动缩进为4个空格的方法详解
Jun 14 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
PHP实现多文件上传的方法
Jul 08 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
php头像上传预览实例代码
May 02 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 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版本的几种方法小结
2008/03/25 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
python线程池的实现实例
2013/11/18 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python3将变量输入的简单实例
2020/08/19 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
企业项目策划书
2014/01/11 职场文书
初一英语教学反思
2014/01/11 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS