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 4.2书写安全的脚本
Oct 09 PHP
聊天室php&mysql(一)
Oct 09 PHP
php购物车实现代码
Oct 10 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
php中如何防止表单的重复提交
Aug 02 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP实现字母数字混合验证码功能
Jul 11 PHP
PHP的cookie与session原理及用法详解
Sep 27 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 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 已经成熟
2006/12/04 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
js的with语句使用方法
2007/09/21 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python标准库sched模块使用指南
2017/07/06 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
python提取log文件内容并画出图表
2019/07/08 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
UDP协议功能
2013/01/06 面试题
大专毕业生简历的自我评价
2013/10/20 职场文书
上班迟到检讨书
2014/01/10 职场文书
文明单位汇报材料
2014/12/24 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书