PHP编写RESTful接口的方法


Posted in PHP onFebruary 21, 2016

这是一个轻量级框架,专为快速开发RESTful接口而设计。如果你和我一样,厌倦了使用传统的MVC框架编写微服务或者前后端分离的API接口,受不了为了一个简单接口而做的很多多余的coding(和CTRL-C/CTRL-V),那么,你肯定会喜欢这个框架!

先举个栗子
1、写个HelloWorld.php,放到框架指定的目录下(默认是和index.php同级的apis/目录)

/**
 * @path("/hw")
 */
class HelloWorld
{
  /** 
   * @route({"GET","/"})
   */
  public function doSomething() {
    return "Hello World!";
  }
}

2、浏览器输入http://your-domain/hw/
你将看到:Hello World!就是这么简单,不需要额外配置,不需要继承也不需要组合。
发生了什么
回过头看HelloWorld.php,特殊的地方在于注释(@path,@route),没错,框架通过注释获取路由信息和绑定输入输出。但不要担心性能,注释只会在类文件修改后解析一次。更多的@注释后面会说明。

再看个更具体的例子
这是一个登录接口的例子

/**
 * 用户权限验证
 * @path("/tokens/") 
 */
class Tokens
{ 
  /**
   * 登录
   * 通过用户名密码授权
   * @route({"POST","/accounts/"}) 
   * @param({"account", "$._POST.account"}) 账号
   * @param({"password", "$._POST.password"}) 密码
   * 
   * @throws ({"InvalidPassword", "res", "403 Forbidden", {"error":"InvalidPassword"} }) 用户名或密码无效
   * 
   * @return({"body"})  
   * 返回token,同cookie中的token相同,
   * {"token":"xxx", "uid" = "xxx"}
   *
   * @return({"cookie","token","$token","+365 days","/"}) 通过cookie返回token
   * @return({"cookie","uid","$uid","+365 days","/"}) 通过cookie返回uid
   */
  public function createTokenByAccounts($account, $password, &$token,&$uid){
    //验证用户
    $uid = $this->users->verifyPassword($account, $password);
    Verify::isTrue($uid, new InvalidPassword($account));
    $token = ...;
    return ['token'=>$token, 'uid'=>$uid];
  } 
  /**
   * @property({"default":"@Users"})  依赖的属性,由框架注入
   * @var Users
   */
  public $users;
}

还能做什么

  • 依赖管理(依赖注入),
  • 自动输出接口文档(不是doxgen式的类、方法文档,而是描述http接口的文档)
  • 接口缓存
  • hook

配合ezsql访问数据库
ezsql是一款简单的面向对象的sql构建工具,提供简单的基本sql操作。
接口

/** @path(/myclass) */
class MyClass{

  /**
  * @route({"GET","/do"})
  * @param({"arg0","$._GET.arg0"})
  */
  public doSomething($arg0){
    return Sql::select('xxx')->from('table_xxx')->where( 'xxx = ?', $arg0)->get($this->db);
  }
  /**
   * 依赖注入PDO实例
   * @property
   * @var PDO
   */
  public $db;
}

配置文件

{
  {
    "MyClass":{
      "properties":{
        "db":"@db1"   
      }
    },
  },
  "db1":{
    "singleton":true,
    "class":"PDO",
    "pass_by_construct":true,
    "properties":{
      "dsn":"mysql:host=127.0.0.1;dbname=xxx",
      "username":"xxxx",
      "passwd":"xxxx"      
    }
  },
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
php函数与传递参数实例分析
Nov 15 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
PHP常用的排序和查找算法
Aug 06 PHP
教你php如何实现验证码
Jan 20 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
Laravel 实现密码重置功能
Feb 23 PHP
PHP与以太坊交互详解
Aug 24 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 PHP
PHP常见漏洞攻击分析
Feb 21 #PHP
php采集神器cURL使用方法详解
Feb 19 #PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 #PHP
PHP利用imagick生成组合缩略图
Feb 19 #PHP
对比分析php中Cookie与Session的异同
Feb 19 #PHP
php强大的时间转换函数strtotime
Feb 18 #PHP
php实现中文转数字
Feb 18 #PHP
You might like
php 数组的指针操作实现代码
2011/02/08 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
Python备份Mysql脚本
2008/08/11 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
python实现车牌识别的示例代码
2019/08/05 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
结婚周年感言
2014/02/24 职场文书
刑事上诉状范文
2015/05/22 职场文书
事业单位岗位说明书
2015/10/08 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Oracle使用别名的好处
2022/04/19 Oracle