SkillAgentSearch skills...

MicroMVC

Framework:simple、efficient、 easy to project migration, DMVC+C architecture design, only for PHP 7.0+, support nginx+lua mvc architecture

Install / Use

/learn @pureisle/MicroMVC
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

为什么用

  • 不过度设计,简单、清晰、好用。经历过国内一线互联网公司众多项目实践,能很好的解决大部分业务研发过程中遇到的团队协作、项目管理、质量和安全等问题;
  • 提供最简单基础的 MVC 框架,将性能损耗降到最低。关于性能
  • 支持简单的Lua MVC , 需要 Openresty 。
  • 按 Module 进行资源分离,以便对业务进行微服务化隔离或后期的服务便捷迁移。关于Module和迁移
  • 提供简单好用的单元测试框架。关于单元测试
  • 提供便捷的接口参数合法性验证服务,接口合法性调用检测服务,做了基础的防SQL注入、CSRF、XSS等安全防护。关于安全
  • 提供简单好用工具类,如 MysqlCurl多进程管理(pcntl)常驻进程任务监控保活等资源的封装、Xhprof 性能优化工具等;
  • 根据代码运行的环境自动加载相应的配置文件,方便的切换仿真、生产环境;
  • 提供PSR-3规范的日志类,额外提供 log buffer 功能(性能提升) 和 全局日志标记码(一个进程一个标记码,方便定位问题)的功能;
  • 所有开发基于 PHP7 环境,未做低版本运行验证和兼容;

框架工具库说明

  • ConfigTool 框架统一的配置文件读取类,限定了配置文件的存放路径,可支持 .php 或 .ini 或 自定义文件的配置读取。
  • Context 环境变量类,可以使用全局的 Context::$G ,也可以自定义。主要用于层级较深的参数传递、全局变量存储等。
  • Curl 发起HTTP协议请求的客户端类。
  • MultiCurl 并行批量发起HTTP请求的客户端类。
  • Daemon CLI模式下任务执行基类,一般配合 bins/run_daemon.php 或 ProcessManager 使用。
  • DaemonMonitor 常驻进程的任务监控类,探测任务文件变化而重启任务、监控任务、超时任务kill、退出的任务重新拉起等。
  • Debug 调试类,可以设置调试信息的输出和禁用。生产环境会强制禁用输出调试信息。
  • Degrader 降级类,提供三种降级方式:1、按单个Key降级;2、按群组降级;3、按时间范围降级;
  • Exception 异常管理基类,强制按静态数组的方式定义异常,统一管理。
  • KeyBuilder 强制按一定方式定义和编码KEY值的工具类。
  • PHPFunctionParser 针对PHP代码文件,利用 token_get_all 函数进行格式化解析。主要用来做单元测试时,计算测试覆盖率。
  • ProcessManager 多进程管理类,可以控制一批任务执行并监控和记录任务执行过程中的状态、资源利用等。
  • RunTime 计时器,主要提供了按Key记录运行时间的开始、停止和输出的方法。
  • TestSuite 单元测试工具的基类,可以通过 bins/run_test.php 工具来执行单元测试。
  • UnitTest 单元测试控制类,主要提供了单元测试控制的功能。
  • UserAgentParser UA解析类,主要提供了客户端请求中携带UserAgent的分析方法。
  • Validator 变量或参数合法性检验工具。提供了一些常用的检验方法。
  • Tools 常用工具类
    • retryAgent 执行重试代理,可以方便的执行一段代码的多次重试。
    • base64UrlEncode base64UrlDecode 64进制编解码
    • getEnv setEnv 框架内比较重要的一个方法,可以设置代码运行环境标识,用以区分和使用不同的配置文件,方便多环境运行。
    • iniFuncEnabled 检验ini配置中的函数是否可以使用。
    • isCli 检查当前代码是否为CLI模式运行。
    • uniqid 生成指定长度的随机码,伪随机。
    • 网络相关
  • [资源管理] 一些常用的资源工具
    • IniParser INI 格式的配置文件的编码和解码工具。
    • Logger 日志类,符合PSR-3标准。额外提供进程内唯一标识码,方便一次性排查出一次请求的所有相关日志。
    • Memcached Memcached管理类,进行了简单封装,主要目的是强制统一资源配置文件的部署和格式。
    • ControllCache 统一的缓存管理基类,提供了三级缓存,分别为:1、内存缓存;2、本地文件缓存;3、远端缓存(redis、mc)。
    • ControllMysql SQL语句封装类,可以不写SQL构建数据库查询,同时提供了较为完善的安全防护。
    • PDOManager PDO管理类,强制了资源配置部署和格式;提供了基础方法的封装;
    • Redis Redis扩展的简单封装,主要是为了强制统一资源配置文件的部署和格式。
  • [设计模式] 一些常用的设计模式工具
    • EntityBase 实体类基类,提供参数列表限制和参数校验等基础能力。
    • FiniteState 状态机的状态基类,主要是为配合状态机FiniteStateMachine使用。
    • FiniteStateMachine 状态机管理类,提供状态注册、管理、运行控制等功能,使用样例见PHPFunctionParser
    • HookManager 钩子管理类,通过配置文件定义钩子,在触发钩子时执行预定义的方法或函数。
    • SingletonManager 单例工厂,提供了进程内类的统一管理和复用。可以使用全局定义的单例工厂 SingletonManager::$SINGLETON_POOL,也可以自定义一个单例工厂。

快速开始

composer create-project pureisle/micro-mvc {project_name}
php bins/create_module.php {module_name}

其中{project_name}替换成目标项目名,{module_name}替换成目标模块名。

文件目录

|- Framework	框架
	|- config	框架全局配置
	|- Libraries	框架类库
	|- Entities	数据实体类
	|- Models	框架逻辑
	|- Tests	单元测试
|- public  框架公开访问位置
	|- xhprof(可删除)       性能调优工具前端页面,任何的 Module 的静态文件都应该新建一个同名文件夹存放
	|- index.php 	入口文件
	|- index.lua    lua入口文件
	|- init.lua     lua初始化文件
|- bins
	|- cli.php  命令行入口
	|- create_module.php    创建一个空的Module
	|- run_test.php     单元测试入口
	|- run_daemon.php   后台任务执行入口
	|- lua-releng   lua代码检测工具,方便检测全局变量、变量名等
	|- grpc_php_plugin  grpc的php编译模块
	|- update_framework.sh  框架更新工具
|- Sso(可删除)	样例应用,一个简单的Sso用户单点登录系统
	|- Cache	缓存管理文件
	|- config	应用配置文件(mysql、redis等资源配置;api接口配置等;不能变动)
	|- Controllers	控制器(不能变动)
	|- Daemons  后台进程任务类(不能变动)
	|- Models	业务逻辑类 
	|- Data 	数据访问类
	|- Entities 业务实体类
	|- Views	视图文件(不能变动)
	|- Plugins	插件文件
	|- Libraries	类库文件
	|- Tests	单元测试文件(不能变动)
	|- Bootstrap.php 	应用启动初始化文件(不能变动,可以没有)
|- Index(可删除)   默认 Module
|- Xhprof(可删除)  php性能调优工具
|- vendor(可删除)  composer工具包文件夹,不使用的话可以删除

文件结构也体现了 "DMVC+C" 的分层思想。

  • "D" 层为数据层,对应的文件夹为"Data"。该层主要解决数据结构的封装,对上层屏蔽底层的数据结构、存储工具等细节;
  • "M" 层为逻辑层,对应的文件夹为"Models"。该层主要解决业务逻辑的封装,对上层屏蔽业务逻辑的细节;
  • "C" 层为控制层,对应的文件夹为"Controllers"。该层主要控制相应URL提供哪些服务,根据自身提供的服务引用Model层提供的服务。该层主要负责:安全检验、登录检验、根据接口的目的调用相应 Model、日志记录等;
  • "V" 层为视图层,对应文件夹为"Views"。该层主要提供前端页面渲染的代码,主要为HTML代码,夹杂少量JS、CSS等,或作为目前流行的前后端分离设计的前端入口文件等;
  • "+C" 层为缓存层,对应的文件夹为"Cache"。该层主要控制缓存相关逻辑。
  • "public" 文件夹主要存放静态资源,如图片、JS代码库、CSS表等;

详细的情况可以参见 Sso Module,有更多的使用样例,包括 Cache、config、Bootstrap.php等

开始使用

MVC框架

  1. 配置 Web Server 服务器重定向到入口文件。Nginx 样例如下:
root /data1/www/htdocs/service.movie.weibo.com/public/;
if ( !-f $request_filename ) { 
	#这里 /index.php/$1 路径要不要带 public 主要依赖配置的 root 路径是什么
    rewrite "^/(.*)" /index.php/$1 last;
}
#下边是控制静态资源访问路径,可以不要
location ~* .(css|js|img)$ {
    root /data1/www/htdocs/service.movie.weibo.com/public/;
    if (-f $request_filename) {
        expires off;
        break;
    }   
}
  1. 路由解析规则:域名后第一个用'/'分离的部分为 module 名,最后一部分为 action 名,中间部分解析为 controller。如:
http://service.movie.weibo.com:8183/demo/demo/a/index?a=test&b=12  
Module: Demo  
Controller: Demo\Controllers\Demo\A  
Action: index  
参数: a 和 b

这里要注意,url结尾有没有"/"很关键,结尾有"/"意味着 Action 的值会解析成 index 。
样例项目中,访问 sso 地址为: http://domain.example.com/sso/login

  1. 每个 module 可以有自己的 Bootstrap.php 在自己的根目录里,在框架初始化时会顺序执行'_init'开头的成员方法。
  2. 每个 module 有自己的路由插件在 Plugins 文件夹内,可以在 Bootstrap 类中调用 Dispatcher 类的 registerPlugin 方法进行插件注册。 插件包含routerStartup、routerShutdown、dispatchStartup、dispatchShutdown、preResponse几个部分。分别为:
routerStartup : 路由规则解析前  
routerShutdown :路由规则解析后  
dispatchStartup : 控制器分发前  
dispatchShutdown : 控制器分发后  
preResponse : 页面渲染结果输出前
  1. 每个 Con
View on GitHub
GitHub Stars19
CategoryCustomer
Updated1y ago
Forks14

Languages

PHP

Security Score

80/100

Audited on Mar 11, 2025

No findings