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 相关文章推荐
解决MySQL中文输出变成问号的问题
Jun 05 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
php 将excel导入mysql
Nov 09 PHP
PHP获取php,mysql,apche的版本信息示例代码
Jan 16 PHP
php教程之phpize使用方法
Feb 12 PHP
php生成随机密码自定义函数代码(简单快速)
May 10 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
PHP的PDO连接讲解
Jan 24 PHP
laravel中Redis队列监听中断的分析
Sep 14 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/10/09 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
js压缩利器
2007/02/20 Javascript
摘自百度的图片轮换效果代码
2007/11/19 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
Django 使用logging打印日志的实例
2018/04/28 Python
Pygame的程序开始示例代码
2020/05/07 Python
python判断正负数方式
2020/06/03 Python
Python中的全局变量如何理解
2020/06/04 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
Python configparser模块应用过程解析
2020/08/14 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
ET Mall东森购物网:东森严选
2017/03/06 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
公司财务流程之主管工作流程
2014/03/03 职场文书
生产文员岗位职责
2014/04/05 职场文书
工程售后服务承诺书
2014/05/21 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
团委工作总结2015
2015/04/02 职场文书
病假条格式范文
2015/08/17 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
vue使用watch监听属性变化
2022/04/30 Vue.js