public为程序入口

Demo和MyApp为具体的实现

public为多入口

demo和myapp都是入口,但是进入后即又为单入口

list为接口文档,是自动解析程序里的注释自动生成的文档

框架执行流程

Public/demo-》Demo/Api-》Demo/Domain-》Demo/Model

Api/User.php

主要是接收传参,以及调用Domain/User.php里的方法(有点像实体类)

<?php

class Api_User extends PhalApi_Api {

    public function getRules() {
return array(
'getBaseInfo' => array(
'userId' => array('name' => 'user_id', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
),
'getMultiBaseInfo' => array(
'userIds' => array('name' => 'user_ids', 'type' => 'array', 'format' => 'explode', 'require' => true, 'desc' => '用户ID,多个以逗号分割'),
),
);
} /**
* 获取用户基本信息
* @desc 用于获取单个用户基本信息
* @return int code 操作码,0表示成功, 1表示用户不存在
* @return object info 用户信息对象
* @return int info.id 用户ID
* @return string info.name 用户名字
* @return string info.note 用户来源
* @return string msg 提示信息
*/
public function getBaseInfo() {
$rs = array('code' => 0, 'msg' => '', 'info' => array()); $domain = new Domain_User();
$info = $domain->getBaseInfo($this->userId); if (empty($info)) {
DI()->logger->debug('user not found', $this->userId); $rs['code'] = 1;
$rs['msg'] = T('user not exists');
return $rs;
} $rs['info'] = $info; return $rs;
} /**
* 批量获取用户基本信息
* @desc 用于获取多个用户基本信息
* @return int code 操作码,0表示成功
* @return array list 用户列表
* @return int list[].id 用户ID
* @return string list[].name 用户名字
* @return string list[].note 用户来源
* @return string msg 提示信息
*/
public function getMultiBaseInfo() {
$rs = array('code' => 0, 'msg' => '', 'list' => array()); $domain = new Domain_User();
foreach ($this->userIds as $userId) {
$rs['list'][] = $domain->getBaseInfo($userId);
} return $rs;
}
}

Domain/User.php

主要是方法的抽象实现,不是具体实现,类似于一个服务,这样有利于方法重用

<?php

class Domain_User {

    public function getBaseInfo($userId) {
$rs = array(); $userId = intval($userId);
if ($userId <= 0) {
return $rs;
} // 版本1:简单的获取
$model = new Model_User();
$rs = $model->getByUserId($userId); // 版本2:使用单点缓存/多级缓存 (应该移至Model层中)
/**
$model = new Model_User();
$rs = $model->getByUserIdWithCache($userId);
*/ // 版本3:缓存 + 代理
/**
$query = new PhalApi_ModelQuery();
$query->id = $userId;
$modelProxy = new ModelProxy_UserBaseInfo();
$rs = $modelProxy->getData($query);
*/ return $rs;
}
}

Model/User.php

方法的具体实现,最小粒度

<?php

class Model_User extends PhalApi_Model_NotORM {

    public function getByUserId($userId) {
return $this->getORM()
->select('*')
->where('id = ?', $userId)
->fetch();
} public function getByUserIdWithCache($userId) {
$key = 'userbaseinfo_' . $userId;
$rs = DI()->cache->get($key);
if ($rs === NULL) {
$rs = $this->getByUserId($userId);
DI()->cache->set($key, $rs, 600);
}
return $rs;
} /**
protected function getTableName($id) {
return 'user';
}
*/
}

缓存方法

 public function getByUserIdWithCache($userId) {
$key = 'userbaseinfo_' . $userId;
$rs = DI()->cache->get($key);
if ($rs === NULL) {
$rs = $this->getByUserId($userId);
DI()->cache->set($key, $rs, 600);
}
return $rs;
}

如果缓存不存在,执行sql查询

否则直接返回缓存值

一个很漂亮的接口文档

phalapi的更多相关文章

  1. Phalapi 中Union和Union All的用法

    有时候在进行数据库查询的时候会用到union查询,但是查询的时候会发现两个limit只有一个是有效的,如下查询 select * from table where status = 0 limit 1 ...

  2. 【Phalapi】新加Namespace (模块)

    官网地址: https://www.phalapi.net/ github 地址: https://github.com/phalapi/phalapi/tree/master-2x 1 compos ...

  3. phalApi框架打印SQL语句

    http://demo.phalapi.net/?service=User.getBaseInfo&user_id=1&__sql__=1

  4. PhalApi 1.4.2 经典封存版 - 码云

    https://www.phalapi.net/ PhalApi 1.x 是经典封存版本,已停止更新,历练考验,可放心使用. 主要采用PEAR命名规范,遵循PSR-0,不支持命名空间和composer ...

  5. PhalApi 2.7 开发快速上手

    PhalApi是一款国人制作的PHP纯后端框架.它的开发相当简单,同时也具备文档生成等特色功能.下面,我通过简单的几点,让你可以快速入门使用该框架的开发. 建议使用PHPStorm作为IDE,代码提示 ...

  6. phalapi框架where条件查询

    // WHERE name = 'dogstar' AND age = 18 $user->where(array('name' => 'dogstar', 'age' => 18) ...

  7. phalApi数据库操作

    在很多时候,我们会遇到数据库表里面的某个值需要+1操作,我们不能简单地在update的时候写入array('key' => 'key+1'),因为在解析sql的时候,key+1 会带上引号作为一 ...

  8. 开源top100

    1.SwitchyOmega 项目简介:SwitchyOmega 是 SwitchySharp 的新版本.这是一个 Chrome 浏览器用来切换不同代理的插件.SwitchyOmega 初次安装时会检 ...

  9. PhalGo-介绍

    PhalGo-介绍 phalgo是一个Go语言的一体化开发框架,主要用于API开发应为使用ECHO框架作为http服务web程序一样可以使用,牛顿曾经说过"如果我比别人看得远,那是因为我站在 ...

随机推荐

  1. C# ArrayList 基本用法 分类: C# 2014-09-26 11:03 524人阅读 评论(0) 收藏

    首先说明一下ArrayList 与 数组的区别: (1)ArrayList 的容量可以根据需要自由扩充,数组的容量是固定的 (2)ArrayList 只能是一维形式,数组可以是多维的 (3)Array ...

  2. hdu2660 Accepted Necklace (DFS)

    Problem Description I have N precious stones, and plan to use K of them to make a necklace for my mo ...

  3. java中调用js脚本

    JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...

  4. Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序:Comparator)

    1. 比较器排序(定制排序) 前面我们说到的TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列. 但是如果需要实现定制排序,比如实现降序排序,则要通过比较器排序(定制排序)实 ...

  5. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

  6. Python之路【第五篇】:面向对象和相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  7. laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的问题

    遇到的问题: laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的问题(safari下也有同样问题); 解决办法: 给laydate绑定id; 解决前代码: <input ...

  8. node基础再现--module.exports 和exports

    实际上,最最基础的方法,最最原始的方法是module.exports,至于exports,是为了方便书写才出来的,应该说,module.exports 包含exports,所工作的范围更加的广泛! m ...

  9. Java-Android 之输入提示框

    Android的文本提示框有两种方式: main.xml文件 <?xml version="1.0" encoding="utf-8"?> < ...

  10. android 蓝牙4.0 开发介绍

    最近一直在研究一个蓝牙功能 由于本人是菜鸟  学起来比较忙 一直搞了好久才弄懂 , 网上对蓝牙4.0也就是几个个dome 抄来抄去,全是英文注解 , 对英语不好的朋友来说 真是硬伤 , 一些没必要的描 ...