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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
全文搜索和替换
Oct 09 PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php中curl使用指南
Feb 05 PHP
PHP获取文件相对路径的方法
Feb 26 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
PHP中list方法用法示例
Dec 01 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 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生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
angular4自定义组件详解
2017/09/28 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
python局域网ip扫描示例分享
2014/04/03 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python 实现波浪滤镜特效
2020/12/02 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
教师校本培训方案
2014/02/26 职场文书
《秋游》教学反思
2014/04/24 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
设计专业自荐信
2014/06/19 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android