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采集速度探究总结(原创)
Apr 18 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
PHP关联链接常用代码
Nov 05 PHP
php实现文件编码批量转换
Mar 10 PHP
php生成年月日下载列表的方法
Apr 24 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP和MYSQL实现分页导航思路详解
Apr 11 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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 socket编程
2015/05/13 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP 中常量的知识整理
2017/04/14 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
Python 专题四 文件基础知识
2017/03/20 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python安装gdal的两种方法
2019/10/29 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
消防标语大全
2014/06/07 职场文书
感谢信的格式
2015/01/21 职场文书
飞越疯人院观后感
2015/06/09 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
Python使用MapReduce进行简单的销售统计
2022/04/22 Python