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
PHP4中session登录页面的应用
Jul 25 PHP
PHP 定界符 使用技巧
Jun 14 PHP
小文件php+SQLite存储方案
Sep 04 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
优化PHP程序的方法小结
Feb 23 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
制作个性化的WordPress登陆界面的实例教程
May 21 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 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文件上传主要代码讲解
2013/09/30 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python中的super用法详解
2015/05/28 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python实现控制COM口的示例
2019/07/03 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
公司酒会致辞
2015/07/30 职场文书
创业计划书之养殖业
2019/10/11 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers