Yii RESTful API 使用教程

修改配置

修改请求配置 让 Yii 识别 json 格式 POST 数据

修改路由规则配置 让 Yii 解析 GET POST PUT DELETE 请求到不同方法

  • GET /user: 逐页列出所有用户; 对应 index 方法
  • POST /user: 创建一个新用户; 对应 create 方法
  • GET /user/123: 返回用户 123 的详细信息; 对应 view 方法
  • PUT /user/123: 更新用户123; 对应 update 方法
  • DELETE /user/123: 删除用户123; 对应 delete 方法

    'components' => [
        // ...
        'request' => [
            // ...
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
                'text/json' => 'yii\web\JsonParser',
            ],
        ],
        // ...
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                // ...
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [ // RSETful 控制器名
                        // 'user',
                        'api/user', // 单应用 分模块
                    ],
                    'pluralize' => false, // 禁用 复数
                ],
                // ...
            ],
        ],
        // ...
    ],

控制器写法

<?php

namespace app\modules\api\controllers;

/**
 * User
 * 
 * @version 0.1.3
 * @author 爱思路 <sc.419@qq.com>
 * @link https://asilu.com/
 * 
 * 2021-05-27 --:--
 * 
 */
class UserController extends \yii\rest\ActiveController
{
    /**
     * @var string
     */
    public $modelClass = 'app\modules\api\resources\User';
}

对应资源模型

<?php

namespace app\modules\api\resources;

/**
 * User fields
 * 
 * @version 0.1.3
 * @author 爱思路 <sc.419@qq.com>
 * @link https://asilu.com/
 * 
 * 2021-05-27 --:--
 * 
 */
class User extends \app\models\User // 继承用户模型
{
    public function fields()
    {
        return [
            'id',
            'username',
            'name',
            'avatar',
            'school_id',
            'created_at',
            'logged_at',
        ];
    }

    public function extraFields()
    {
        return [
            'records',
        ];
    }
}

数据列表 index 方法公共参数

数据搜索

如果想搜索指定数据 就需要 传输 filter 参数 用搜索指定数据

  • filter[name]=王家辉 查找 name王家辉 的数据
  • filter[name][like]=王 查找 name 包含 的数据
  • filter[name][like]=王&filter[school_id]=1 查找 name 包含 school_id1 的数据 (多个示例)
  • filter[name][like]=王&filter[school_id]=1 查找 name 包含 school_id1 的数据 (多个示例)
  • filter[created_at][gt]=1621678757 创建时间 (int) created_at 大于 1621678757
  • filter[created_time][>]=2021-05-27 08:00:00 创建时间 (datetime) created_time 大于 2021-05-27 08:00:00
 [
   'not' => 'NOT',
   'lt' => '<',
   'gt' => '>',
   'lte' => '<=',
   'gte' => '>=',
   'eq' => '=',
   'neq' => '!=',
   'in' => 'IN',
 ]
数据排序

如果列表数据以指定字段排序 就需要 传输 sort 参数

  • sort=idid 正序 (默认)
  • sort=-idid 倒叙序
  • sort=-id,school_id 多字段排序
指定页数

page 页数 从第 1 页开始

per-page 每页条数

fields 显示字段 如只需要显示部分字段 可以使用 如:fields=id,title

expand 附加字段 如:expand=desc,content

解析获取页码信息
// axios 为例 毕竟现在大多框架使用的都是 它
axios.get('/user')
    .then(function(response) {
        console.log(response.data); // 用户列表数据 相应主体数据
        console.log(response.headers); // 包含 分页信息 响应头信息 x-pagination-*
        /**
         * response.headers['x-pagination-current-page']  当前是第几页
         * response.headers['x-pagination-page-count']    数据总页数
         * response.headers['x-pagination-total-count']   数据总条数
         * response.headers['x-pagination-per-page']      数据分页条数
        **/
    });

Post Author: admin