[关闭]
@phper 2018-09-29T09:20:15.000000Z 字数 5956 阅读 258

ulink_frame php框架简明教程

gitbook


ulink_frame 是ulink平台上使用的php cgi接口框架,它主打简单实用高效。是一个小而简的框架。简单的路由加上简单的数据ORM,帮助快速开发实现功能。请使用php7进行开发。

一、框架目录

  1. ├── Ctrl // 控制器层
  2. ├── Index.php
  3. ├── Demo.php
  4. |
  5. ├── Lib // 核心内库
  6. ├── Base // 基础库文件夹
  7. ├── Ctrl.php
  8. └── Function.php
  9. └── HttpRequest.php
  10. └── Redis.php
  11. ├── Db // 数据库类库
  12. ├── DbModel.php
  13. └── DbProxy.php
  14. └── DbMysql.php
  15. ├── Paas // 功能服务接口SDK
  16. ├── Base.php
  17. └── DataMore.php
  18. └── IDIP.php
  19. └── Lottery.php
  20. └── Role.php
  21. └── XXXX.php
  22. ├── App.php //Lib库主入口
  23. |
  24. ├── Model // 数据库层
  25. ├── ExchangeModel.php
  26. └── XModel.php
  27. |
  28. ├── Logic // 逻辑层
  29. ├── ConvertLogic.php
  30. └── XLogic.php
  31. |
  32. ├── Service // 服务层
  33. ├── IDIPServer.php
  34. └── L5Server.php
  35. ├── Logs // 本地日志目录
  36. ├── 20180928.log //(要打开写入权限)
  37. └── 20180929.log
  38. |
  39. ├── config.php //自定义配置文件
  40. ├── index.php // 主入口
  41. └── README.md

按照MVC划分思想,框架目录的结构为:

二、如何使用

先把源码下载到本地。有2种方式可以运行。

1. 用php自带server启动服务,不用Nginx或者Apache

  1. # cd /data/www/ulink_frame
  2. # php -S 127.0.0.1:8200
  3. PHP 7.2.0 Development Server started at Fri Sep 28 15:23:54 2018
  4. Listening on http://127.0.0.1:8200
  5. Document root is /data/www/ulink_frame
  6. Press Ctrl-C to quit.

2. 使用Nginx + php-fpm

请先运行php-fpm。

Nginx配置如下:

  1. server {
  2. listen 8200;
  3. server_name 127.0.0.1;
  4. root /data/www/ulink_frame;
  5. index index.php index.html index.htm;
  6. access_log /usr/local/var/log/nginx/ulink.access.log main;
  7. error_log /usr/local/var/log/nginx/ulink.error.log error;
  8. location ~ \.php$ {
  9. fastcgi_pass 127.0.0.1:9000;
  10. fastcgi_index index.php;
  11. include fastcgi.conf;
  12. }
  13. }

然后启动或者重启Nginx。

打开浏览器访问:

http://127.0.0.1:8200/index.php?route=Index/welcome

返回json类型的字符串:

  1. {
  2. "iRet": 0,
  3. "sMsg": "welcome",
  4. "jData": [
  5. "hello, world"
  6. ]
  7. }

三、路由介绍

我们访问cgi接口的地址如下:

http://127.0.0.1:8200/index.php?route=Index/welcome

其中route参数是必须的,它代表着路由规则参数,没做其他很复杂的正规匹配路由或者pathinfo模式的路由,只希望简单高效。

  1. route=Index/welcome
  2. 表示访问的是Ctrl目录下Index.php文件下的welcome方法。
http://127.0.0.1:8200/index.php?route=User/add
  1. route=User/add
  2. 表示访问的是Ctrl目录下User.php文件下的add方法。

很简单,无需其他定义。

四、代码规范

请必须要完全遵循 PSR 的代码书写规范。

规范地址:https://www.php-fig.org/psr/

中文翻译地址:https://psr.phphub.org/

1. 大小写问题的代码规范简述:

  1. 文件夹的名字要首字母大写,大驼峰的方式。
  2. 文件名首字母大写。大驼峰的方式。
  3. 必须使用 Namespace 命名空间的方式来组织目录和代码结构。
  4. Namespace 首字母大写。大驼峰的方式。
  5. Class 类名,首字母大写。大驼峰的方式。
  6. function 方法名,首字母小写,小驼峰方式。
  7. 常量名(CONST)声明必须要全部大小,如果有多个单词,就用_分开。

2. 换行、空格以及注释问题的规范简述:

  1. Class 类名的后面的左花括号 { 换行。
  2. Function 函数名后面的左花括号{ 换行。
  3. 控制语句(if、else、 while、 switch、try、catch)后面的左花括号 { 不要换行。
  4. 所有的单词的左右都得加1个空格。
  5. 所有的类和函数都得加注释。

3. 例子说明

  1. http://127.0.0.1:8200/index.php?route=User/add
  2. 对应:Ctrl文件夹下的User.php文件
  3. \Ctrl\User.php //首字母大写
  4. User.php 首字母大写。
  5. add 首字母小写。
  6. <?php
  7. /*****************************************************
  8. * File name: User.php
  9. * Create date: 2018/09/07
  10. * Author: smallyang
  11. * Description: 用户模块cgi
  12. *****************************************************/
  13. namespace Ctrl; //换行
  14. use Lib; //换行
  15. class User extends Lib\Base\Ctrl
  16. {
  17. /**
  18. * 用户信息
  19. */
  20. CONST USER = 'user_info';
  21. /**
  22. * 用户年龄段
  23. */
  24. CONST USER_AGE_LIST = [18,20,30,40];
  25. /**
  26. * 添加新用户
  27. */
  28. public function add()
  29. {
  30. //if else
  31. if ($expr1) { //左右空格
  32. // if body
  33. } elseif ($expr2) { //elesif 连着写
  34. // elseif body
  35. } else {
  36. // else body;
  37. }
  38. //switch
  39. switch ($expr) { //左右空格
  40. case 0:
  41. echo 'First case, with a break'; //对其
  42. break; //换行写break ,也对其。
  43. case 1:
  44. echo 'Second case, which falls through';
  45. // no break
  46. case 2:
  47. case 3:
  48. case 4:
  49. echo 'Third case';
  50. return;
  51. default:
  52. echo 'Default case';
  53. break;
  54. }
  55. //while
  56. while ($expr) { //左右空格
  57. // structure body
  58. }
  59. //do while
  60. do {
  61. // structure body; //左右空格
  62. } while ($expr);
  63. //for
  64. for ($i = 0; $i < 10; $i++) {
  65. //注意几个参数之间的空格
  66. // for body
  67. }
  68. //foreach
  69. foreach ($iterable as $key => $value) {
  70. //还是空格问题
  71. // foreach body
  72. }
  73. //try catch
  74. try {
  75. // try body
  76. } catch (FirstExceptionType $e) {
  77. //同样也是注意空格。
  78. // catch body
  79. } catch (OtherExceptionType $e) {
  80. // catch body
  81. }
  82. $this->outputJSON(0, 'ok');
  83. }
  84. }

4. 自动化格式工具

phpstrom

目前很多编辑器自带PSR规范的自动格式化功能,比如phpstrom。我们每次写完代码,用快捷键 cmd+opt+L ,就能快速格式化代码。

PHP-CS-Fixer

PHP Coding Standards Fixer 根据PSR 1~2封装的自动化脚本,可以自动格式化我们的项目代码。

官方地址:https://github.com/FriendsOfPHP/PHP-CS-Fixer

简单安装和使用如下:

  1. $ curl -L https://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -o php-cs-fixer #安装
  2. $ sudo chmod a+x php-cs-fixer
  3. $ sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer
  4. $ php php-cs-fixer fix /path/to/dir //格式化文件夹
  5. $ php php-cs-fixer fix test.php //格式化单个文件

四、类库调用

由于框架采用 Namespace 命名空间的方法来定义文件夹和类的,所以,是非常方便的来调用任何文件夹下的任何文件的。

命名空间的名字是和目录名一致的,所以,我们只需要知道那个类库文件在哪个目录下,就能轻松调用。

  1. 比如我们new redis类。
  2. 文件路径是: Lib/Base/Redis.php
  3. 那么我只需 user 一下即可:
  4. use Lib\Base\Redis;
  5. $redis = Redis::init();
  6. 或者:
  7. use Lib;
  8. $redis = Lib\Base\Redis::init();

这就意味着,我们可以自定义很多文件和文件夹,只要按照这样的命名方式,就可以很随意的调用。

  1. -----
  2. Model/UserModel.php 文件namespace 申明为:Model
  3. ||
  4. use Model\UserModel;
  5. ||
  6. $userModel = new Model();
  7. -----
  8. Extent/Api/UserApi.php 文件namespace 申明为:Extent\Api
  9. ||
  10. use Extent\Api\UserApi
  11. ||
  12. $UserApi = new UserApi();

五、DB ORM 介绍

框架自带了一个mysql的ORM。和其他框架一样,可以链式串联调用,减少写sql以及减少sql注入的可能。

可以在任何地方调用,只需要申明命名空间调用即可。

  1. <?php
  2. use Lib; //使用
  3. $db = Lib\Db\DbModel::init(); // 父类方法,自动切换
  4. //$db = Lib\db\DbMysql::init(DB_HOST); // 本地mysql
  5. //$db = Lib\db\DbProxy::init(DB_HOST); // 线上proxy
  6. //查询多条
  7. $list = $db->table('uss')->limit(10)->select();
  8. //查询多条,单列
  9. $list = $db->table('uss')->limit(10)->select('num');
  10. //查询1条
  11. $list0 = $db->table('uss')->where(['id' => 10])->find();
  12. $list0 = $db->table('uss')->where(['id' => 10])->find('num');
  13. //总数
  14. $list1 = $db->table('uss')->where(['id' => ['!=', 1]])->count();
  15. $list2 = $db->table('uss')->where(['num' => ['<=', 100], 'id' => ['>=', 10]])->count();
  16. //新增
  17. $list4 = $db->table('uss')->insert(['num' => 9, 'ddate' => '2019/09/09']);
  18. //update
  19. $list5 = $db->table('uss')->where(['id' => 3050])->update(['num' => 1234]);
  20. //删除
  21. $db->table('uss')->where(['id' => 3051])->delete();
  22. //直接写SQL修改(update、delete、add)
  23. $db->exec('delete from uss where id = 12;');
  24. //直接写SQL 查询(select)
  25. $db->query('select * from uss where id = 12;');
  26. //分表
  27. $list5 = $db->table('uss')->sub('12345', 10)->where(['id' => ['!=', 1]])->order('num', 'ASC')->limit(10)->select();
  28. //事务
  29. try {
  30. $db->begin();
  31. $db->table('uss')->insert(['num' => 99, 'ddate' => '2019/09/09']);
  32. $db->table('uss')->where(['id' => 3050])->update(['num' => 5678]);
  33. $db->table('uss')->where(['id' => 3051])->delete();
  34. $db->commit();
  35. } catch (\Exception $e) {
  36. $db->rollBack();
  37. echo "Failed: " . $e->getMessage();
  38. }

注意:由于线上环境隔离,本地无法调用线上的MySQL以及Redis环境。但是本地和线上proxy调用方式一样,所以得本地得申明DB_HOST常量配置,调用自己的本地的MySQL。上线之后,无须改动代码,无缝切换。

六、Paas类库调用

Paas类库主要封装了活动日常中使用到的,诸如:

角色查询
发送礼包
填写收货地址
调用IDIP接口
调用Datamore接口

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注