接口控制器

不管是前后台分离,还是 APP 调用接口。所有的入口都是由api/v1/controller等同于api/版本号/控制器组成。

举个例子,比如http://host/api/v1/order_service/method/get.order.service.list

所有的控制器都直接或间接的继承于app\api\controller\CareyShop做为基类。 文件位置application/api/controller/CareyShop.php

控制器

每一个控制器默认都会绑定一个对应的模型,模型的存放目录是application/common/model。 比如App控制器对应的模型也是App,实际导入的文件是application/common/model/App.php,您可以通过static::$model这样的方式在控制器中完成对模型的调用。注意:完成继承的控制器必须要有对应模型,否则会报错。 ```php {16} /**

  1. * 获取所有子级分类
  2. * @access protected
  3. * @return array
  4. */
  5. protected function getCategorySon()
  6. {
  7. $catData = $this->getParams();
  8. $validate = $this->validate($catData, 'GoodsCategory.son');
  9. if (true !== $validate) {
  10. return $this->setError($validate);
  11. }
  12. // ↓↓↓ 注意看这一句 ↓↓↓
  13. return self::$model->getCategorySon($catData);
  14. }
  1. 基类主要完成请求参数验证、整理请求参数、数据初始化、验证身份、验证签名、验证权限、方法路由器、返回数据结果。
  2. 控制器中的`方法路由器`是二次开发必定会接触到的,他的定义如下:
  3. ```php
  4. <?php
  5. namespace app\api\controller\v1;
  6. use app\api\controller\CareyShop;
  7. class App extends CareyShop
  8. {
  9. /**
  10. * 方法路由器
  11. * @access protected
  12. * @return array
  13. */
  14. protected static function initMethod()
  15. {
  16. return [
  17. // 添加一个应用
  18. 'add.app.item' => ['addAppItem'],
  19. // 编辑一个应用
  20. 'set.app.item' => ['setAppItem', false],
  21. // 获取一个应用
  22. 'get.app.item' => ['getAppItem', 'app\common\model\AppName'],
  23. ];
  24. }
  25. protected function setAppItem()
  26. {
  27. return '编辑成功';
  28. }
  29. }

可以看到他是一个数组,键名表示业务方法。键值也是一个数组,首位表示成员函数的名称,第二位是附带参数,含义如下:

  • 空:在无值的情况下,首先查找控制器内是否存在成员函数,否则查找与控制器同名的模型下是否存在成员函数,如果还找不到则报错。
  • false:表示与控制器同名的模型不存在,直接在控制器内查找是否存在成员函数,找不到则报错。
  • 命名空间:在指定的命名空间类中查找成员函数,找不到则报错。

模型

控制器调用模型(或是指定的命名空间类成员函数)后会对函数首位参数进行赋值,值的内容由请求参数传递进来。 所以在模型中类的成员函数定义也分多种。

  1. 不需要参数的成员函数

    1. /**
    2. * 添加或编辑购物车商品
    3. * @access public
    4. * @return false|array
    5. * @throws
    6. */
    7. public function setCartItem()
    8. {
    9. return [];
    10. }
  2. 只需要请求参数的成员函数

    1. /**
    2. * 添加或编辑购物车商品
    3. * @access public
    4. * @param array $data 外部数据
    5. * @return false|array
    6. * @throws
    7. */
    8. public function setCartItem($data)
    9. {
    10. return [];
    11. }
  3. 带有请求参数和自定义参数的成员函数

    1. /**
    2. * 添加或编辑购物车商品
    3. * @access public
    4. * @param array $data 外部数据
    5. * @param bool $isBuyNow 是否立即购买
    6. * @return false|array
    7. * @throws
    8. */
    9. public function setCartItem($data, $isBuyNow = false)
    10. {
    11. return [];
    12. }

只要成员函数带有参数,那么第一个参数必定是属于请求参数,他是一个数组。 添加其他参数可以是任意类型,这个特点可以在框架内部调用时十分方便。