# CornerPHP **Repository Path**: myDcool/SummerPHP ## Basic Information - **Project Name**: CornerPHP - **Description**: 模块化,路由化,易调试的PHP框架。自带登录注册,Redis队列,接口验签, 数据库操作等模块;数据库支持虚拟表名,多主机读写分离,分库分表等实用功能;前端支持SPA,自研常用JS控件,常用CSS样式(flex布局为主)(原SummerPHP) - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: https://doc.hearu.top - **GVP Project**: No ## Statistics - **Stars**: 23 - **Forks**: 9 - **Created**: 2017-01-01 - **Last Updated**: 2024-12-21 ## Categories & Tags **Categories**: webframework **Tags**: None ## README # CornerPHP ##### 模块化, 静态化, 层级少, 易调试, 支持多数据库链接/读写分离 ##### 参考文档: http://doc.hearu.top/ ##### 原SummerPHP ##### 若要支持命名空间请参考:https://gitee.com/myDcool/meng-php (推荐,如有bug两个框架会同步更新) ## 目录结构 ``` / Framework Root |-- core 框架的核心类 |-- config 配置文件 |-- libs 第三方库 |-- model 模型类, 理论上用于写获取数据的具体逻辑, 只放置在根目录下, 任何控制器都可以调用到 |-- modules 项目模块 |-- view 视图文件 |-- tool 框架自带的登录注册模块的SQL,数据库配置文件样例,windows启动php-cgi的脚本 |-- update 框架自更新脚本 |-- static 静态文件存放 |-- cli.php 命令行下的入口文件 php cli.php -q router_name `-- index.php web入口文件 ``` ## 安装步骤 1. 下载框架代码 2. 配置NGINX ```` server { listen 80; server_name www.test.com; location ~ \.ico|jpg|gif|png|js|css$ { root E:/php/code/project/static; #expires 1h; } location / { root E:/php/code/project; fastcgi_pass 127.0.0.1:9720; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/index.php; include fastcgi_params; } } ```` 3. 修改hosts文件,添加: ```` 127.0.0.1 www.test.com ```` 4. 复制并修改 tool/dbConfig.json 文件中的数据库链接信息, 放到某个目录下; 修改入口文件index.php/cli.php 中的`MYSQL_HOST_FILE`值为dbConfig.json的文件路径 5. 启动nginx; 启动php: php-cgi.exe(windows) 或 php-fpm (Linux) 6. 在浏览器中输入 www.test.com 访问首页 (首页默认是数据库信息) ## 核心功能使用说明 ### URL路由 > 参考 core/Route.php (配置文件: config/RouteConfig.php) 1. 配置: 所有对外可访问的接口都要在 config/RouteConfig.php中配置映射规则, 接口与真正的方法是映射关系, 不直接暴露源代码的方法名 2. 例子: 获取文章列表的第二页接口的映射规则为 ``` //路由配置: 'article_list_(\d+)' => 'index/index/route/page/$1' ``` ``` //浏览器中输入URL: http://www.test.com/article_list_2 ``` 3. 默认路由: 如果浏览器中只输入域名,没有URI,框架会找到 modules/index/index.php::index() 方法并执行 (也可以在RouteConfig.php中配置默认路由) 4. 命令行路由: ``` php cli.php -q article_list_2 ``` ### 获取请求数据 > 参考 core/Request.php (数据校验的配置在config/VerifyConfig.php) 1. 获取一个值 ``` Request::Get('a', 'default'); Request::Post('a'); Request::Cookie('a'); Request::Route('a'); ``` 2. 获取多个值, 没有则用默认值替代 ``` Request::pickData(['a' => 0, 'b' => '', 'c' => '0'], 'get') ``` 3. 是否是post请求 ``` Request::isPost(); ``` ### 返回结果 > 参考 core/Response.php 1. 输出固定格式的json数据 ``` $a = ['list' => [1,2,3,4]]; Response::json(10000, '用户列表', $a); 结果: {"code":10000,"msg":"\u7528\u6237\u5217\u8868","data":{"list":[1,2,3,4]}} ``` 2. 便捷调用 > Response::json()的简写, 返回结构是一样的 ``` //成功返回: Response::success($a); Response::success($a, '用户列表'); Response::success($a, '用户列表', 20000); ``` ``` //失败返回: Response::error('参数错误'); 结果: {"code":"-1","msg":"\u53c2\u6570\u9519\u8bef","data":[]]} Response::error('参数错误', $a); 结果: {"code":"-1","msg":"\u53c2\u6570\u9519\u8bef","data":{"list":[1,2,3,4]},"url":""} Response::error('参数错误', $a, 20001); 结果: {"code":2001,"msg":"\u53c2\u6570\u9519\u8bef","data":{"list":[1,2,3,4]}} ``` 3. 返回任意结构的json数据 ``` Response::jsonReturn($a); //{"list":[1,2,3,4]} ``` 4. 跳转 ``` Response::notify('页面找不到啦~'); //页面找不到啦~ Response::redirect('充值成功, 页面即将跳转', 'http://www.hearu.top', 3); Response::jump('http://www.hearu.top'); //直接跳转 ``` ### 返回HTML页面 > 参考: core/View.php 1. 显示单个页面 ``` View::display(); ``` 2. 插入式显示页面(一个HTML页面框架, 里边有占位符:{{xxx}}) ``` View::render(); ``` ### 数据库操作 > 更多增删改查操作请查看 modules/index/index.php::sql() ``` $rs = Test::link('note') ->fields('id,content') ->where(['uid' => 1, 'age' => 20]) ->whereOp('id', '>', 1) ->whereIn('status', [0,1,2]) ->order('id desc') ->limit(10) ->select() ->getAll(); var_dump($rs, Test::$currentSql); ``` ### 文件日志 > 参考 libs/FileLog.php
> 日志文件存放的目录在入口文件 index.php 和 cli.php 中配置: LOGPATH 和 LOG_LEVEL 1. 常用 ``` FileLog::info([xxx], 'tag'); //日志文件: LOGPATH/yyyy-mm-dd.log, 数组内容会被转为json 或 FileLog::error('xxxx'); ``` 2. 设置日志跟踪ID ``` FileLog::$uuid = time().Fun::randChar(5); ``` ### Redis消息队列 - 基础类在: libs/IRedis.php - 队列类在: model/RedisQueue.php - 队列名的配置在: config/RedisConfig.php - 具体实现参考: modules/cli/queue.php ### DB消息队列 - 队列类在: model/DBQueue.php - Topic的配置在: config/TopicConfig.php - 需要添加消费者的crontab (路由: cli_queue_db_consumer), 代码在 module/cli/queue_db.php ### 自带登录注册模块 - 用户信息用cookie加密存储 - 功能有: 登录/注册/退出, 其中注册提供图形验证码 ### 自带前端单页面应用(SPA)样例 - 按照上边说明安装好PHP运行环境 - 配置好数据库信息(dbConfig.php) - 浏览器访问首页,即是一个可查看个多主机/数据库/表/字段等信息的web应用 ### 自带多个js插件 > 路径: static/sys/js (使用方法在每个js文件的底部, 也可参考 https://exchange.hearu.top/ 一个个人商城项目) | 脚本名 | 说明 | |---|---| | zbActionSheet.js | 弹窗表单, 支持 单行文本/多行文本/单选/多选/添加图片 | | zbEditTable.js | 可编辑表格, 支持 创建可编辑的表格, 只读表格; 支持动态增加/删除行; 支持批量更改属性; 支持批量获取输入的值 | | zbImage.js | 图片拼接: 支持创建二维码, 二维码加文字, 图片加二维码水印(依赖 在static/lib/jquery-qrcode.min.js); 支持创建浮层图片(点击后隐藏) | | zbUploadImage.js | 上传图片: 支持跟随上传其他参数, 支持图片压缩(依赖 static/lib/lrz.min.js) | | zbList.js | 列表: 支持onclick事件; 支持仅展示无响应事件的静态列表 | | zbPanel.js | 可折叠的列表: 支持点击后回调 | | zbRequest.js | 发起http请求: 支持缓存(依赖 static/lib/md5.min.js); 支持自定义成功后回调 | | zbRouter.js | 单页面路由: 支持匹配URL调用指定的回调方法, 并无刷新更新浏览器地址栏URL | | zbTabNav.js | 导航栏: 支持点击后tab高亮, 调用回调, 页面无刷新切换, 可放在页面任意位置 | | zbToolBar.js | 工具栏: 支持显示在底部或顶部显示 | | zbTool.js | 工具方法合集: 获取年月日; 获取随机数; 字符串拼接补全; 获取URL参数; 跳转页面,刷新页面; 字符串和json互转; html转dom; 数组转HTML; 回到顶部; 等 | ### 安全建议 - 尽量用post: 绝大部分的xss攻击是通过