接口管理控制器(V4.0.0版本新增)

豆信4.0.0版本开始支持插件Api控制器,用于为小程序开发提供接口。在插件的Controller目录下新增ApiController,继承Mp模块的ApiBase控制器,即可方便的实现小程序数据交互接口。如在Demo插件的ApiController中定义了一个getDataList()接口,则可以通过路由:/addon/Demo/api/getDataList/mpid/2 进行请求操作。

注意:接口请求必须带上mpid参数,用于标识请求对接的是哪个账号(小程序mpid或公众号mpid),否则接口请求将会被拒绝。

ApiBase控制器封装了以下方法用于快速的实现接口交互逻辑。

  1. checkLogin(); // 如果接口需要限制小程序端用户登录后方可调用,则在接口方法开始处调用此方法。
  2. login(); // 小程序用户登录接口
  3. isLogin(); // 用于检测小程序端用户是否已登录
  4. updateProfile(); // 用于更新小程序用户资料
  5. getSettings(); // 用于获取插件配置
  6. response(); // 用户返回接口响应数据
  7. responseOk(); // 请求成功响应,响应码为:0
  8. responseFail(); // 请求失败响应,响应码为:1001

插件Api控制器继承ApiBase控制器后,可以有两种方式调用上述封装的接口,比如Demo插件需要获取配置信息时,可以通过下面两种方式请求接口:/addon/Demo/api/getSettings/mpid/1或者/Mp/ApiBase/getSettings/mpid/1

我们推荐使用第一种基于插件的Api调用方式。

下面是Demo插件的Api控制器完整示例:

  1. <?php
  2. /**
  3. * Demo插件Api控制器
  4. * @author 艾逗笔<http://idoubi.cc>
  5. */
  6. namespace Addons\Demo\Controller;
  7. use Mp\Controller\ApiBaseController;
  8. class ApiController extends ApiBaseController {
  9. public $model;
  10. public function __construct() {
  11. parent::__construct();
  12. $this->model = M('demo_diary');
  13. }
  14. // 新增日记
  15. public function addDiary() {
  16. $this->checkLogin(); // 检测用户是否登录
  17. $post = I('post.');
  18. if (empty($post['title']) || empty($post['content'])) {
  19. $this->response(1001, '提交数据不完整');
  20. }
  21. $post['openid'] = $this->openid;
  22. $post['mpid'] = $this->mpid;
  23. $post['created_at'] = time();
  24. $id = $this->model->add($post);
  25. if ($id) {
  26. $this->response(0, '提交反馈成功');
  27. } else {
  28. $this->response(1001, '提交反馈失败');
  29. }
  30. }
  31. // 获取日记列表
  32. public function getDiaryList() {
  33. $this->checkLogin();
  34. $data = $this->model->where([
  35. 'mpid' => $this->mpid,
  36. 'openid' => $this->openid,
  37. 'status' => 1
  38. ])->field('id,title,content,created_at')->order('created_at desc')->select();
  39. foreach ($data as &$v) {
  40. $v['created_at_format'] = date('Y-m-d H:i:s', $v['created_at']);
  41. }
  42. $this->response(0, '获取成功', $data);
  43. }
  44. // 修改日记
  45. public function editDiary() {
  46. $this->checkLogin();
  47. $post = I('post.');
  48. if (empty($post['id']) || empty($post['title']) || empty($post['content'])) {
  49. $this->response(1001, '提交数据不完整');
  50. }
  51. $id = $post['id'];
  52. $data = $this->model->where([
  53. 'mpid' => $this->mpid,
  54. 'openid' => $this->openid,
  55. 'status' => 1
  56. ])->find($id);
  57. if (empty($data)) {
  58. $this->response(1001, '要修改的数据不存在');
  59. }
  60. $res = $this->model->where([
  61. 'id' => $id
  62. ])->save([
  63. 'title' => $post['title'],
  64. 'content' => $post['content'],
  65. 'updated_at' => time()
  66. ]);
  67. if ($res === false) {
  68. $this->response(1001, '修改失败');
  69. }
  70. $this->response(0, '修改成功');
  71. }
  72. // 删除日记
  73. public function deleteDiary() {
  74. $this->checkLogin();
  75. $id = I('post.id');
  76. $data = $this->model->where([
  77. 'mpid' => $this->mpid,
  78. 'openid' => $this->openid,
  79. 'status' => 1
  80. ])->find($id);
  81. if (empty($data)) {
  82. $this->response(1001, '要删除的数据不存在');
  83. }
  84. // 软删除
  85. $res = $this->model->where([
  86. 'id' => $id
  87. ])->save([
  88. 'status' => -1,
  89. 'deleted_at' => time()
  90. ]);
  91. if ($res === false) {
  92. $this->response(1001, '删除失败');
  93. }
  94. $this->response(0, '删除成功');
  95. }
  96. }