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和ACCESS写聊天室(一)
Oct 09 PHP
PHP 面向对象 PHP5 中的常量
May 05 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
PHP中的strtr函数使用介绍(str_replace)
Oct 20 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
Jul 19 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
PHP如何将XML转成数组
Apr 04 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python有序查找算法之二分法实例分析
2017/12/11 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
Python 函数返回值的示例代码
2019/03/11 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
python Tensor和Array对比分析
2020/01/08 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
2016年母亲节广告语
2016/01/28 职场文书
高一作文之暖冬
2019/11/09 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL