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 相关文章推荐
如何做到多笔资料的同步
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
Laravel 5 框架入门(三)
Apr 09 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
详细分析PHP 命名空间(namespace)
Jun 30 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
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
2016/08/02 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Django中的用户身份验证示例详解
2019/08/07 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
利用python 读写csv文件
2020/09/10 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
Ruby如何定义一个类
2012/10/08 面试题
行政经理岗位职责
2013/11/09 职场文书
社区志愿者心得体会
2014/01/03 职场文书
2014年接待工作总结
2014/11/26 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android