要让Yii2.0.52项目跑起标准RESTful API接口,必须同时满足URL路由、数据解析、控制器继承、模型验证四个条件,缺一不可——漏掉任意一项,/v1/users就会返回404或空响应。

配置urlManager启用REST路由
打开config/web.php,在components下找到urlManager配置块。
把'enablePrettyUrl' => true和'showScriptName' => false设为true,否则所有请求都会被重定向到index.php前缀路径,REST规则根本不会触发。
在rules数组末尾追加一条yii\rest\UrlRule,controller值必须与实际控制器路径严格对应:若控制器类是api\modules\v1\controllers\UserController,此处写['v1/user'],【小写字母、无命名空间、斜杠分隔】,写成['V1/User']或['api/v1/user']都会导致404。
确保'enableStrictParsing' => true,否则自定义规则会拦截REST请求;但这条规则必须放在所有自定义规则之后,否则/v1/users会被前面的'v1/<action>'</action>之类规则吃掉。
启用JSON数据解析器
在components中找到request配置项,添加parsers子项:
'parsers' => ['application/json' => 'yii\web\JsonParser']
这一步不能省——Yii2默认只解析application/x-www-form-urlencoded格式,POST/PUT请求若用JSON传参(如{"name":"test"}),不配这个解析器就会静默丢弃全部body数据,返回400且无错误提示。
如果同时要支持XML,可追加'application/xml' => 'yii\web\XmlParser',但注意XmlParser需额外安装ext-simplexml扩展,否则启动时报错。
创建REST控制器
方法一:直接继承yii\rest\ActiveController
新建文件api/modules/v1/controllers/UserController.php,内容如下:
namespace api\modules\v1\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController { public $modelClass = 'api\modules\v1\models\User'; }
注意$modelClass必须指向完整命名空间路径,且该类必须继承yii\db\ActiveRecord;如果模型在common\models\User,这里就写'common\models\User',不能省略common\前缀。
方法二:手动绑定动作(仅当需要精细控制时)
若要禁用DELETE动作或改写create逻辑,在控制器中重写actions():
public function actions() { $actions = parent::actions(); unset($actions['delete']); return $actions; }
但必须保留parent::actions()调用,否则index/view等基础动作全部失效。
定义模型验证规则
第一步:确认模型类已定义rules()方法,且返回非空数组。例如:
public function rules() { return [['username', 'email'], 'required']; }
第二步:检查模型主键字段名。ActiveController默认按id查找记录,若数据库主键是uid或user_id,必须重写findModel()方法:
protected function findModel($id) { return $this->modelClass::findOne(['uid' => $id]); }
第三步:测试POST接口时,用curl命令绕过前端验证:
curl -X POST http://localhost/v1/users \
-H "Content-Type: application/json" \
-d '{"username":"test","email":"test@example.com"}'
如果返回400且响应体为空,90%是rules()没定义或字段名拼写错误;如果返回201但数据库无数据,检查模型tableName()是否返回了正确表名。


















