
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载Yii 2 内置了一套面向 RESTful API 的完整组件链从控制器、路由规则、内容协商到序列化、分页与认证无需额外安装任何扩展即可在最小代码量下把 ActiveRecord 数据模型暴露为规范的 HTTP 接口。本文以docs/guide-uk/rest-quick-start.md与英文原版 docs/guide/rest-quick-start.md 同源为骨架结合framework/rest/目录下的真实源码实现带你在几分钟内完成User模型的增删改查 API并深入讲解分页、排序、字段裁剪与 JSON 输入等细节读完即可照搬到自己的项目中。Yii 2 为 RESTful API 提供的内置能力Yii 对 RESTful Web Service API 的实现提供了整套开箱即用的工具快速回顾其能力清单快速原型基于 Active Record 提供常见 API 的极速搭建一个控制器类即可生成增删改查全套端点响应格式协商默认支持 JSON 与 XML 两种格式根据请求的Accept头自动切换可定制的对象序列化支持通过fields/expand参数选择输出字段规范的集合与错误格式化集合数据、分页信息、校验错误均有统一输出结构集合的分页、过滤与排序IndexAction底层由ActiveDataProvider驱动天然支持page、sort、filter等参数HATEOAS 支持响应中携带Link头与_links元数据便于客户端发现资源关系高效路由与 HTTP 动词校验yii\rest\UrlRule自动生成 RESTful 路由并由VerbFilter强制校验请求方法内置OPTIONS与HEAD支持用于跨域预检与只获取元数据认证与授权authenticator行为挂载了CompositeAuth数据缓存与 HTTP 缓存限流Rate limiting见 rest-rate-limiting。下面我们用一个完整示例演示如何以最小工作量把用户数据已存在user数据表及对应的 active record 模型类app\models\User暴露为 RESTful API。第一步创建控制器首先创建控制器类app\controllers\UserControllernamespace app\controllers; use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass app\models\User; }控制器继承自yii\rest\ActiveController通过设置modelClass为app\models\User控制器就知道该用哪个模型类来读取和操作数据。从 framework/rest/ActiveController.php 的源码可以看到ActiveController默认装配了 6 个动作动作 ID动作类默认允许的 HTTP 动词作用indexyii\rest\IndexActionGET,HEAD模型列表viewyii\rest\ViewActionGET,HEAD单个模型详情createyii\rest\CreateActionPOST创建新模型updateyii\rest\UpdateActionPUT,PATCH更新已有模型deleteyii\rest\DeleteActionDELETE删除已有模型optionsyii\rest\OptionsAction任意返回允许的 HTTP 方法源码层面的几个关键点值得注意init()中强制校验modelClass不能为空ActiveController.php否则抛出InvalidConfigException每个动作都会把checkAccess回调注入其中默认的 checkAccess() 为空实现你需要重写它来做权限控制无权限时应抛出ForbiddenHttpExceptioncreate与update动作分别使用createScenario与updateScenario属性指定的场景默认均为Model::SCENARIO_DEFAULT可在控制器中覆盖想禁用某些动作只需重写actions()并unset对应键想新增动作则在actions()中追加动作类并同步重写verbs()声明允许的 HTTP 动词ActiveController.php。ActiveController的基类 framework/rest/Controller.php 通过behaviors()挂载了四个行为构成了 REST 请求处理的主干流程contentNegotiator内容协商application/json→Response::FORMAT_JSON、application/xml→Response::FORMAT_XMLverbFilter依据verbs()校验请求方法authenticator用户认证CompositeAuth默认空配置即不启用需要自行配置认证方式参见 rest-authenticationrateLimiter限流。此外 REST 控制器默认关闭了 CSRF 校验$enableCsrfValidation false因为 API 通常基于 token 而非会话 Cookie 认证。动作执行完毕后afterAction()会调用serializeData()将结果交给 framework/rest/Serializer.php 统一序列化后再交给响应格式化器输出。第二步配置 URL 规则在应用配置中修改urlManager组件urlManager [ enablePrettyUrl true, enableStrictParsing true, showScriptName false, rules [ [class yii\rest\UrlRule, controller user], ], ]这段配置为user控制器添加了一条yii\rest\UrlRule规则使得用户数据可以通过漂亮的 URL 和语义化的 HTTP 动词来访问与操作。关于这条规则有几个高频注意点自动复数化Yii 会自动把控制器名转为复数形式用于端点例如user会出现在 URL 中变成users。如不需要可用UrlRule::$pluralize属性关闭UrlRule.php或在controller属性中显式指定 URL 名称如[u user]only/except只生成/排除某些动作对应的规则例如except [delete]即可禁用删除接口extraPatterns追加自定义端点模式且优先于默认patterns匹配tokens默认令牌{id} id:\d[\d,]*即id必须是数字可支持逗号分隔的组合主键prefix/suffix统一给所有规则加前缀路径或 URL 后缀多控制器controller支持数组如[user, post]会为每个控制器生成一套规则UrlRule.php。UrlRule在 createRule() 中把每个模式解析为yii\web\UrlRule最终生成的完整端点映射如下见 UrlRule.php 注释PUT,PATCH users/id→user/updateDELETE users/id→user/deleteGET,HEAD users/id→user/viewPOST users→user/createGET,HEAD users→user/indexusers/id→user/options兜底未处理动词users→user/optionsUrlRule的测试位于 tests/framework/rest/UrlRuleTest.php覆盖了复数化、only/except、extraPatterns、多控制器等场景是理解该规则行为的最佳参考。第三步启用 JSON 输入为了让 API 接收 JSON 格式的请求体需要在request应用组件上配置parsers属性把application/json的解析交给yii\web\JsonParserrequest [ parsers [ application/json yii\web\JsonParser, ] ]说明上述配置是可选的。如果不配置API 只能识别application/x-www-form-urlencoded与multipart/form-data两种输入格式也就是说客户端将无法直接以 JSON 请求体调用POST /users。从 framework/web/JsonParser.php 的源码可以看到asArray默认trueJSON 会被解码为关联数组方便直接交给模型load()当请求体是非法 JSON 时若throwException为true默认会抛出BadRequestHttpExceptionHTTP 400额外兼容了 JSONPContent-Type为application/javascript时会先剥离 JSONP 包装再解码。CreateAction正是依赖这个解析结果完成创建流程的$model-load(Yii::$app-getRequest()-getBodyParams(), )加载请求体保存成功后返回 HTTP 201 并在Location头中带上新资源的 URLframework/rest/CreateAction.php。第四步试运行你的 API经过以上三步RESTful API 已经就绪。你现在拥有的接口包括GET /users分页返回所有用户列表HEAD /users返回用户列表的概览信息仅头部POST /users创建新用户GET /users/123返回 id 为 123 的用户详情HEAD /users/123返回该用户的概览信息PATCH /users/123与PUT /users/123更新该用户DELETE /users/123删除该用户OPTIONS /users返回/users端点支持的 HTTP 方法OPTIONS /users/123返回/users/123端点支持的 HTTP 方法。用curl测试获取 JSON 列表$ curl -i -H Accept:application/json http://localhost/users HTTP/1.1 200 OK Date: Sun, 02 Mar 2014 05:31:43 GMT Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y X-Powered-By: PHP/5.4.20 X-Pagination-Total-Count: 1000 X-Pagination-Page-Count: 50 X-Pagination-Current-Page: 1 X-Pagination-Per-Page: 20 Link: http://localhost/users?page1; relself, http://localhost/users?page2; relnext, http://localhost/users?page50; rellast Transfer-Encoding: chunked Content-Type: application/json; charsetUTF-8 [ { id: 1, ... }, { id: 2, ... }, ... ]把可接受的内容类型改为application/xml响应就会变成 XML 格式$ curl -i -H Accept:application/xml http://localhost/users HTTP/1.1 200 OK Date: Sun, 02 Mar 2014 05:31:43 GMT Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y X-Powered-By: PHP/5.4.20 X-Pagination-Total-Count: 1000 X-Pagination-Page-Count: 50 X-Pagination-Current-Page: 1 X-Pagination-Per-Page: 20 Link: http://localhost/users?page1; relself, http://localhost/users?page2; relnext, http://localhost/users?page50; rellast Transfer-Encoding: chunked Content-Type: application/xml ?xml version1.0 encodingUTF-8? response item id1/id ... /item item id2/id ... /item ... /response创建一个新用户注意此时必须配置了上一步的JsonParser$ curl -i -H Accept:application/json -H Content-Type:application/json \ -XPOST http://localhost/users \ -d {username: example, email: userexample.com} HTTP/1.1 201 Created ... Location: http://localhost/users/1 Content-Length: 99 Content-Type: application/json; charsetUTF-8 {id:1,username:example,email:userexample.com,created_at:1414674789,updated_at:1414674789}提示你也可以直接在浏览器地址栏输入http://localhost/users访问 API但浏览器可能需要安装插件才能发送自定义请求头。仔细观察响应头你会发现其中带有总条数X-Pagination-Total-Count、总页数X-Pagination-Page-Count、当前页码X-Pagination-Current-Page、每页条数X-Pagination-Per-Page等信息还有Link头指向其他数据页例如http://localhost/users?page2即可获取第二页数据。这些头正是由 framework/rest/Serializer.php 中定义的四个分页头常量生成对应的序列化测试可参考 tests/framework/rest/SerializerTest.php。用 fields 与 expand 裁剪输出字段通过 URL 参数fields和expand可以指定结果中要包含哪些字段。例如http://localhost/users?fieldsid,email只会返回每个用户的id和email。Serializer通过fieldsParam fields与expandParam expand两个属性Serializer.php读取这两个参数。注意调用http://localhost/users时响应里可能包含password_hash、auth_key这类敏感字段。你应当通过 Resources资源 章节介绍的方式重写fields()方法把这些字段从结果中剔除这既是推荐做法也是安全底线。排序与过滤集合还支持排序与过滤排序http://localhost/users?sortemail按 email 升序或http://localhost/users?sort-email降序负号前缀过滤http://localhost/users?filter[id]10或http://localhost/users?filter[email][like]gmail.com这需要配合数据过滤器DataFilter实现详见 Filtering Collections集合过滤。从 framework/rest/IndexAction.php 的prepareDataProvider()可以看到IndexAction会优先读取请求体参数、其次查询参数把pagination与sort配置合并进ActiveDataProvider当配置了dataFilter时还会调用DataFilter::build()生成查询条件并追加到查询中。进阶自定义列表的分页与排序默认每页 20 条。若要修改模型列表的默认分页和排序可以在控制器中配置IndexAction例如把每页改为 10 条并默认按created_at倒序?php namespace app\controllers; use yii\rest\ActiveController; use yii\helpers\ArrayHelper; class UserController extends ActiveController { public $modelClass app\models\User; public function actions() { return ArrayHelper::merge(parent::actions(), [ index [ pagination [ pageSize 10, ], sort [ defaultOrder [ created_at SORT_DESC, ], ], ], ]); } }配置要点说明pagination与sort均支持数组配置会被合并默认值或直接传入Pagination/Sort对象也支持设为false以完全禁用对应能力IndexAction.php传入Pagination/Sort对象时其params会被自动设置为请求参数从而响应客户端传入的page等参数若要更精细地控制查询如按条件过滤可以在IndexAction上设置prepareDataProvider自定义数据提供器回调或prepareSearchQuery在prepareDataProvider内修改查询的回调。关于ActiveController动作的更多自定义方式新增动作、覆盖动作类、自定义verbs()等请参阅 Extending ActiveController。总结把 Yii 用作 RESTful API 框架时核心设计思想是一个 API 端点对应一个控制器动作一个控制器组织同一类型资源的所有端点。资源用数据模型表示资源继承自yii\base\Model凡是涉及数据库关系型或 NoSQL的场景推荐用yii\db\ActiveRecord来表示资源从而直接复用ActiveController预置的 CRUD 动作路由用yii\rest\UrlRule简化一条规则即可生成整套 RESTful 端点并自动完成动词校验与复数化建议独立部署虽然不是强制要求但推荐把 RESTful API 作为独立应用与 Web 前端、后端分离维护这样职责更清晰、维护成本更低。至此你已掌握 Yii 2 从控制器、路由、JSON 输入到序列化输出、分页排序的全链路快速搭建方法。后续可以继续阅读 rest-controllers、rest-resources、rest-routing 与 rest-authentication 等章节为 API 增加认证、权限、缓存与限流等生产级能力。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 RESTful API 快速入门从零搭建用户数据接口的完整实战指南Yii 2 RESTful API 快速入门从零搭建用户数据接口的完整实战指南 本指南基于 Yii 2 框架自带的 REST 工具集演示如何以最小代码量快速后端Web框架Yii 2 RESTful API 快速上手用 ActiveController 在十分钟内搭建一套完整 Web ServiceYii 2 RESTful API 快速上手用 ActiveController 在十分钟内搭建一套完整 Web Service 本指南对应 Yii 2 框架后端Web框架Yii 2 RESTful API 快速入门用 ActiveController 与 UrlRule 十分钟搭建用户数据接口Yii 2 RESTful API 快速入门用 ActiveController 与 UrlRule 十分钟搭建用户数据接口 本指南基于 Yii 2 官方指南后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考