牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii2 使用 RESTful 写API接口 实例

创建时间:2016-02-01 投稿人: 浏览次数:187

Yii2 使用 RESTful?

其实 Yii2 框架本身就对 RESTful 是友好支持的,具体可以看官方文档(http://www.yiichina.com/doc/guide/2.0/rest-quick-start),或者去看源码,都是可以的

注意: 我们使用resTful的同时,需要借助于测试工具进行地址访问,例如: 谷歌的PostMAN,火狐的HttpRequester工具来访问

创建一个控制器 

我的工作目录如图所示 (首先, 参照下面的目录图片,可以看出,我创建了两个大的文件夹,v1,v2,目的是测试访问不同版本的接口)


下面以v2中的文件为例:

创建一个控制器类 apimodulesv2UserController 如下,

namespace apimodulesv2controllers;

use yii
estActiveController;

class UserController extends ActiveController
{
    public $modelClass = "apimodulesv2modelsuserUserBaseInfo";
}

控制器类扩展自 yii estActiveController。通过指定 yii estActiveController::modelClass作为apimodulesv2modelsuserUserBaseInfo, 控制器就能知道使用哪个模型去获取和处理数据。

配置URL规则

修改有关在应用程序配置的urlManager组件的配置:

"urlManager" => [
    "enablePrettyUrl" => true,
    "enableStrictParsing" => true,
    "showScriptName" => false,
    "rules" => [
        ["class" => "yii
estUrlRule", "controller" => "user"],  
    ],
]

说明: 

      a): 上面的配置主要是为user控制器增加一个 URL 规则。这样,用户的数据就能通过美化的 URL 和有意义的 http 动词进行访问和操作。

      b): 上面是没有加上版本的url配置,至于关于版本我将以新的一篇来说明.


配置另外的:

"controllerNamespace" => "apicontrollers",
"components" => [
        "user" => [
            "identityClass" => "apimodulesv1modelsoauthAccessToken",
            "enableAutoLogin" => true,
            "enableSession" => false,
            "loginUrl" => null
        ],

尝试

随着以上所做的最小的努力,你已经完成了创建用于访问用户数据的 RESTful 风格的 API。你所创建的 API 包括:

相比于URL管理的Web应用程序,上述主要的新东西是通过RESTful API请求yii estUrlRule。这个特殊的URL规则类将会建立一整套子URL规则来支持路由和URL创建的指定的控制器。例如, 上面的代码中是大致按照下面的规则:

[
    "PUT,PATCH users/<id>" => "user/update",
    "DELETE users/<id>" => "user/delete",
    "GET,HEAD users/<id>" => "user/view",
    "POST users" => "user/create",
    "GET,HEAD users" => "user/index",
    "users/<id>" => "user/options",
    "users" => "user/options",
]

  • GET /users: 逐页列出所有用户
  • HEAD /users: 显示用户列表的概要信息
  • POST /users: 创建一个新用户
  • GET /users/123: 返回用户 123 的详细信息
  • HEAD /users/123: 显示用户 123 的概述信息
  • PATCH /users/123 and PUT /users/123: 更新用户123
  • DELETE /users/123: 删除用户123
  • OPTIONS /users: 显示关于末端 /users 支持的动词
  • OPTIONS /users/123: 显示有关末端 /users/123 支持的动词

补充:Yii 将在末端使用的控制器的名称自动变为复数。(译注:个人感觉这里应该变为注意)


经过上面的配置后,你会看到你的控制类继承的是yii estActiveController,如果你进这个文件后,你会看到下面这些方法:

public function actions()
{
        return [
            "index" => [
                "class" => "yii
estIndexAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "view" => [
                "class" => "yii
estViewAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "create" => [
                "class" => "yii
estCreateAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
                "scenario" => $this->createScenario,
            ],
            "update" => [
                "class" => "yii
estUpdateAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
                "scenario" => $this->updateScenario,
            ],
            "delete" => [
                "class" => "yii
estDeleteAction",
                "modelClass" => $this->modelClass,
                "checkAccess" => [$this, "checkAccess"],
            ],
            "options" => [
                "class" => "yii
estOptionsAction",
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    protected function verbs()
    {
        return [
            "index" => ["GET", "HEAD"],     
            "view" => ["GET", "HEAD"],      
            "create" => ["POST"],
            "update" => ["PUT", "PATCH"],
            "delete" => ["DELETE"],
        ];
    }

从上面的方法我们可以知道,如果在你使用yii框架自带的方法时,它默认有create, delete, update, index, view等的一下方法

所创建的 API 包括:

  • GET /users: 逐页列出所有用户
  • POST /users: 创建一个新用户
  • GET /users/123: 返回用户 123 的详细信息
  • PATCH /users/123 and PUT /users/123: 更新用户123
  • DELETE /users/123: 删除用户123
但是如果你要是不想用他的某些方法,我们可以通过下面的方法来自己覆盖对应的方法

例如:

public function actions()
{
    $actions = parent::actions();

    // 注销系统自带的实现方法
    unset($actions["index"]);
    
    //unset($actions["create"]);
    //unset($actions["update"]);
    //unset($actions["delete"]);

  return $actions;
}

//覆盖父类的actionIndex方法,并进行重写
public function actionIndex()
{
    //获取用户所有信息
    ......
}

对于其他的方法同上....

于是我们就可以通过方法地址获取想要的数据:GET  http://www.api.com/users


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。