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 相关文章推荐
深入探讨<br />和 \r\n两者有什么区别??
Jun 05 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
Sep 26 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
ThinkPHP框架实现session跨域问题的解决方法
Jul 01 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
PHP会话控制:Session与Cookie详解
Sep 27 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
Nov 28 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
PHP的new static和new self的区别与使用
Nov 27 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
python基本语法练习实例
2017/09/19 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
幼儿园五一活动方案
2014/02/07 职场文书
《胡杨》教学反思
2014/02/16 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
合作协议书模板
2014/10/10 职场文书
保管员岗位职责
2015/02/14 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书