一、环境准备与配置
首先,在开始创建API之前,请确保已经正确安装并设置了Yii2基本应用模板或高级应用模板,并且对MVC架构有一定理解。为了更好地支持 REST 风格的接口设计,可以引入 `yii\rest` 组件:
php
// 在 config/web.php 中添加以下内容到 components 下:
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
// 添加规则以启用 REST 路由
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => '<your-controller-name>'],
],
],
],
二、控制器(Controller)的设计与实现
为你的应用程序定义一个用于处理HTTP请求的RESTful 控制器类,通常位于controllers/api目录下:
php
namespace app\controllers;
use yii\rest\ActiveController;
use yii\helpers\ArrayHelper;
use common\models\User; // 假设你有一个名为User的数据模型需要操作
class UserController extends ActiveController
{
public $modelClass = User::class; // 设置数据模型对应的类名
// 可选:自定义行为如验证token等权限控制
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
/* 示例:
* 'authenticator' => [
'class' => HttpBearerAuth::className(),
],*/
]);
}
// 定义资源特定的操作方法例如GET /users/{id}
protected function findModel($id)
{
if (($model = User::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested user does not exist.');
}
}
// 其他定制化的方法...
}
三、CRUD动作自动映射
通过继承ActiveController,你可以直接利用预置的动作来快速完成CURD(增删改查)功能。默认情况下,会自动对应如下路由以及HTTP动词:
- GET `/api/users`: 获取所有用户列表;
- HEAD `/api/users`: 用户集合元信息获取;
- POST `/api/users`: 创建新用户;
- GET `/api/users/123`: 查看ID为123的单个用户详情;
- PUT/PATCH(`/api/users/123`) : 更新ID为123的用户信息;
- DELETE `/api/users/123`: 删除ID为123的用户;
四、过滤条件与排序参数传递
对于查询筛选或者结果排序的需求,可以通过URL附加相应的查询参数轻松满足,比如:`http://example.com/api/v1/user?status=active&page=5&sort=-created_at`.
五、序列化输出格式调整
针对不同客户端可能要求不同的响应结构需求,可通过重载Serializer组件来自定义JSON或其他格式返回的结果布局。这涉及到修改 controller 类中的 serializer 属性设置:
php
public $serializer = [
'class' => '\yii\web\JsonResponseFormatter',
//'prettyPrint' => YII_DEBUG, // 是否美化 JSON 输出,默认关闭
];
六、API调用示例
基于以上设定好的UserController,我们可以在Postman或者其他任何能发起HTTP请求的应用程序里测试我们的API端点了。例如要查看某个用户的详细资料,我们可以发出一个GET 请求至 URL 如 `https://your-app-domain/api/users/42` ,其中数字"42"是目标用户的唯一标识符。
总结来说,Yii2强大的RESTful特性使开发者能够高效地构造出符合标准规范并且易于维护管理的Web APIs。结合JWT鉴权机制和其他安全策略后,这些API不仅能服务于浏览器前端,也适配于移动APP甚至其他服务器间的通信场景。同时,其良好的可扩展性和灵活性使得应对复杂业务逻辑时游刃有余。