目录搜索
阅读前篇简介Yii 是什么从 Yii 1.1 升级入门安装 Yii运行应用第一次问候使用Forms数据库应用使用 Gii 生成代码进阶应用结构概述入口脚本应用(Applications)应用组件(Application Components)控制器(Controllers)模型(Models)视图(views)模块(Modules)过滤器(Filters)小部件(Widgets)前端资源(Assets)扩展(Extensions)请求处理运行概述启动引导(Bootstrapping)路由和创建URL请求(Requests)响应(Responses)Sessions 和 Cookies错误处理(Handling Errors)日志(Logging)关键概念组件(Component)属性(Property)事件(Events)行为(Behaviors)配置(Configurations)别名(Aliases)类自动加载(Autoloading)服务定位器(Service Locator)依赖注入容器(Dependency Injection Container)配合数据库工作数据库访问 (Data Access Objects)查询生成器(Query Builder)活动记录(Active Record)数据库迁移(Migrations)SphinxRedisMongoDBElasticsearch接收用户数据创建表单(Creating Forms)输入验证(Validating Input)文件上传(Uploading Files)收集列表输入(Collecting Tabular Input)多模型的复合表单(Getting Data for Multiple Models)显示数据格式化输出数据(Data Formatting)分页(Pagination)排序(Sorting)数据提供器(Data Providers)数据小部件(Data Widgets)客户端脚本使用(Working with Client Scripts)主题(Theming)安全认证(Authentication)授权(Authorization)处理密码(Working with Passwords)客户端认证(Auth Clients)最佳安全实践(Best Practices)缓存概述数据缓存片段缓存页面缓存HTTP 缓存RESTfull Web服务快速入门(Quick Start)资源(Resources)控制器(Controllers)路由(Routing)格式化响应(Response Formatting)授权认证(Authentication)速率限制(Rate Limiting)版本(Versioning)错误处理(Error Handling)开发工具调试工具栏和调试器使用Gii生成代码生成API文档测试概述(Overview)配置测试环境(Testing environment setup)单元测试(Unit Tests)功能测试(Function Tests)验收测试(Acceptance Tests)测试夹具(Fixtures)高级专题高级应用模板创建自定义应用程序结构控制台命令核心验证器(Core Validators)国际化收发邮件性能优化共享主机环境模板引擎集成第三方代码小部件Bootstrap 小部件Jquery UI助手类概述Array 助手(ArrayHelper)Html 助手(Html)Url 助手(Url)
文字

控制器

控制器

在创建资源类和指定资源格输出式化后,下一步就是创建控制器操作将资源通过RESTful APIs展现给终端用户。

Yii 提供两个控制器基类来简化创建RESTful 操作的工作:yii\rest\Controller 和 yii\rest\ActiveController, 两个类的差别是后者提供一系列将资源处理成Active Record的操作。 因此如果使用Active Record内置的操作会比较方便,可考虑将控制器类 继承yii\rest\ActiveController,它会让你用最少的代码完成强大的RESTful APIs.

yii\rest\Controller 和 yii\rest\ActiveController 提供以下功能,一些功能在后续章节详细描述:

  • HTTP 方法验证;
  • 内容协商和数据格式化;
  • 认证;
  • 频率限制.

yii\rest\ActiveController 额外提供一下功能:

  • 一系列常用操作: indexviewcreateupdatedeleteoptions;
  • 对操作和资源进行用户认证.

创建控制器类

当创建一个新的控制器类,控制器类的命名最好使用资源名称的单数格式,例如,提供用户信息的控制器 可命名为UserController.

创建新的操作和Web应用中创建操作类似,唯一的差别是Web应用中调用render()方法渲染一个视图作为返回值, 对于RESTful操作直接返回数据,yii\rest\Controller::serializer 和 yii\web\Response 会处理原始数据到请求格式的转换,例如

public function actionView($id){
    return User::findOne($id);
}

过滤器

yii\rest\Controller提供的大多数RESTful API功能通过过滤器实现. 特别是以下过滤器会按顺序执行:

  • yii\filters\ContentNegotiator: 支持内容协商,在 响应格式化 一节描述;
  • yii\filters\VerbFilter: 支持HTTP 方法验证; the Authentication section;
  • yii\filters\AuthMethod: 支持用户认证,在认证一节描述;
  • yii\filters\RateLimiter: 支持频率限制,在频率限制 一节描述.

这些过滤器都在yii\rest\Controller::behaviors()方法中声明, 可覆盖该方法来配置单独的过滤器,禁用某个或增加你自定义的过滤器。 例如,如果你只想用HTTP 基础认证,可编写如下代码:

use yii\filters\auth\HttpBasicAuth;

public function behaviors(){
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
    ];
    return $behaviors;
}

继承 ActiveController

如果你的控制器继承yii\rest\ActiveController,应设置yii\rest\ActiveController::modelClass 属性 为通过该控制器返回给用户的资源类名,该类必须继承yii\db\ActiveRecord.

自定义操作

yii\rest\ActiveController 默认提供一下操作:

  • yii\rest\IndexAction: 按页列出资源;
  • yii\rest\ViewAction: 返回指定资源的详情;
  • yii\rest\CreateAction: 创建新的资源;
  • yii\rest\UpdateAction: 更新一个存在的资源;
  • yii\rest\DeleteAction: 删除指定的资源;
  • yii\rest\OptionsAction: 返回支持的HTTP方法.

所有这些操作通过yii\rest\ActiveController::actions() 方法申明,可覆盖actions()方法配置或禁用这些操作, 如下所示:

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

    // 禁用"delete" 和 "create" 操作
    unset($actions['delete'], $actions['create']);

    // 使用"prepareDataProvider()"方法自定义数据provider 
    $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];

    return $actions;
}

public function prepareDataProvider(){
    // 为"index"操作准备和返回数据provider
}

请参考独立操作类的参考文档学习哪些配置项有用。

执行访问检查

通过RESTful APIs显示数据时,经常需要检查当前用户是否有权限访问和操作所请求的资源, 在yii\rest\ActiveController中,可覆盖yii\rest\ActiveController::checkAccess()方法来完成权限检查。

public function checkAccess($action, $model = null, $params = []){
    // 检查用户能否访问 $action 和 $model
    // 访问被拒绝应抛出ForbiddenHttpException 
}

checkAccess() 方法默认会被yii\rest\ActiveController默认操作所调用,如果创建新的操作并想执行权限检查, 应在新的操作中明确调用该方法。

提示: 可使用Role-Based Access Control (RBAC) 基于角色权限控制组件实现checkAccess()
上一篇:下一篇: