控制器是继承[[yii\base\Controller]]类的对象,负责处理请求和生成响应。 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息。

控制器是由一个或多个操作来组成的。

控制器的路由由 模型id(仅存在于控制器属于非应用的模块)、 控制器id、 操作id 组成。

路由使用如下格式:

ControllerID/ActionID

如果属于模块下的控制器,使用如下格式:

ModuleID/ControllerID/ActionID

控制器ID

通常情况下,控制器用来处理请求有关的资源类型,因此控制器ID通常为和资源有关的名词。 例如使用article作为处理文章的控制器ID。
控制器ID应仅包含英文小写字母、数字、下划线、中横杠和正斜杠, 例如 article 和 post-comment 是真是的控制器ID,article?, PostComment, admin\post不是控制器ID。
控制器Id可包含子目录前缀,例如 admin/article 代表 [[yii\base\Application::controllerNamespace|controller namespace]]控制器命名空间下 admin子目录中 article 控制器。 子目录前缀可为英文大小写字母、数字、下划线、正斜杠,其中正斜杠用来区分多级子目录(如 panels/admin)

控制器ID遵循以下规则衍生控制器类名:

将用正斜杠区分的每个单词第一个字母转为大写。注意如果控制器ID包含正斜杠,只将最后的正斜杠后的部分第一个字母转为大写;
去掉中横杠,将正斜杠替换为反斜杠;
增加Controller后缀;
在前面增加[[yii\base\Application::controllerNamespace|controller namespace]]控制器命名空间.
下面为一些示例,假设[[yii\base\Application::controllerNamespace|controller namespace]]控制器命名空间为 app\controllers:

article 对应 app\controllers\ArticleController;
post-comment 对应 app\controllers\PostCommentController; //此种情况为Comment的首字母大写,而它事中间的单词所以用一个中横线标识下。
admin/post-comment 对应 app\controllers\admin\PostCommentController;
adminPanels/post-comment 对应 app\controllers\adminPanels\PostCommentController.

控制器部署

可通过配置 [[yii\base\Application::controllerMap|controller map]] 来强制上述的控制器ID和类名对应, 通常用在使用第三方不能掌控类名的控制器上。
配置 应用配置 中的application configuration  web.php,如下所示:

[
'controllerMap' => [
// 用类名申明 "account" 控制器
'account' => 'app\controllers\UserController', // 用配置数组申明 "article" 控制器
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
]

默认控制器 : 框架默认的是 site 控制器,不过可以在 web.php里配置,

[
'defaultRoute' => 'main',
]

创建操作: 必须以 action开头的函数。操作方法的名字大小写敏感,ActonName 不会被认为事操作方法。

独立操作

独立操作通过继承[[yii\base\Action]]或它的子类来定义。 例如Yii发布的[[yii\web\ViewAction]]和[[yii\web\ErrorAction]]都是独立操作。
要使用独立操作,需要通过控制器中覆盖[[yii\base\Controller::actions()]]方法在action map中申明,如下例所示:

 public function actions()
{
return [
// 用类来申明"error" 操作
'error' => 'yii\web\ErrorAction', // 用配置数组申明 "view" 操作
'view' => [
'class' => 'yii\web\ViewAction',
'viewPrefix' => '',
],
];
}

如上所示, actions() 方法返回键为操作ID、值为对应操作类名或数组configurations 的数组。 和内联操作不同,独立操作ID可包含任意字符,只要在actions() 方法中申明.
为创建一个独立操作类,需要继承[[yii\base\Action]] 或它的子类,并实现公有的名称为run()的方法, run() 方法的角色和操作方法类似,例如:

namespace app\components;
use yii\base\Action;
class HelloWorldAction extends Action
{
public function run()
{
return "Hello World";
}
}

操作参数

内联操作的操作方法和独立操作的 run() 方法可以带参数,称为操作参数。 参数值从请求中获取,对于[[yii\web\Application|Web applications]]网页应用, 每个操作参数的值从$_GET中获得,参数名作为键;

默认操作:

不做处理的话,默认操作就是 index操作,当然也可以修改,直接覆盖父类的 $defaultAction 变量就可以了,例如:

namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
public $defaultAction = 'home'; public function actionHome()
{
return $this->render('home');
}
}

控制器里的createUrl 和 createAbsoluteUrl方法已经删除了,现在使用的`yii\helpers\Url::toRoute`  来代替,也可以用 Yii::$app->getUrlManager()->createUrl($params),实际都是用UrlManager类的createUrl方法来实现的。

控制器生命周期

处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制器经过以下生命周期来完成请求:

  1. 在控制器创建和配置后,[[yii\base\Controller::init()]] 方法会被调用。
  2. 控制器根据请求操作ID创建一个操作对象:
  3. 如果操作ID没有指定,会使用[[yii\base\Controller::defaultAction|default action ID]]默认操作ID;
  4. 如果在[[yii\base\Controller::actions()|action map]]找到操作ID,会创建一个独立操作;
  5. 如果操作ID对应操作方法,会创建一个内联操作;
  6. 否则会抛出[[yii\base\InvalidRouteException]]异常。
  7. 控制器按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction() 方法;
  8. 如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消; action execution will be cancelled.
  9. 默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;
  10. 控制器执行操作:
  11. 请求数据解析和填入到操作参数;
  12. 控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;
  13. 默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作;
  14. 应用主体获取操作结果并赋值给响应.

Yii框架2.0的控制器的更多相关文章

  1. Yii框架2.0的视图和widgets表单的使用

    2.0的控制器的创建和action方法的添加和1.0的基本是一样的.但我发现他的widgets 的ActiveForm和1.1版本有些不一样的地方. 对于视图基本也是一样的,有render 和 ren ...

  2. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  3. Yii框架2.0的Gii

    Yii框架的Gii在我看来算是个快速创建器,当然对于学习来说意义不大,但对于已经懂得他的原理并用他开发的话,就是个快速开发的好工具. 他能快速的创建控制器,模块,crup,插件,Module. 打开g ...

  4. Yii框架2.0的 验证码

    最近看了一个Yii的教程视频,是按1.1的版本讲的,我想用Yii2.0的框架也参考他的学习开发下,结果发现好多不一样的,现在就说说验证码的事 首先加入一个actions 做验证码图片的显示,实际事调用 ...

  5. Yii框架2.0的模型

    模型是 MVC 模式中的一部分, 是代表业务数据.规则和逻辑的对象. 可通过继承 [[yii\base\Model]] 或它的子类定义模型类,基类[[yii\base\Model]]支持许多实用的特性 ...

  6. Yii框架2.0 数据库操作初接触

    Yii2.0和Yii1.1版本的变动还是挺多的,我发现配置文件有许多不同,Yii1.1版本里有个main.php 好多信息是在这里配置的,比如默认控制器,数据库连接信息:Yii的数据库配置被单独拿出来 ...

  7. Yii框架2.0的模块

    模块是个独立的软件单元,也是又控制器,视图,模型组成的,也可以有自己的布局.但他必须属于某个应用下,不能独立存在. 其中模块的控制器,视图和应用的控制器和视图使用基本相同,不作赘述,下面说说模块的使用 ...

  8. Yii框架2.0的小部件

    小部件是视图里的可重用单元. 小部件是在视图中使用的,但是可能需要使用控制器传给他的模型,比如在渲染表单的时候.比如一般的时间拾取器就可以直接砸视图里加入如下代码就可以: <?php use y ...

  9. Yii框架2.0的过滤器

    过滤器是 控制器 动作 执行之前或之后执行的对象. 例如访问控制过滤器可在动作执行之前来控制特殊终端用户是否有权限执行动作, 内容压缩过滤器可在动作执行之后发给终端用户之前压缩响应内容. 过滤器可包含 ...

随机推荐

  1. 移动端rem的用法

    标签: 1.rem(font size of the root element)是指相对于根元素的字体大小的单位,em(font size of the element)是指相对于父元素的字体大小的单 ...

  2. 整合hibernate的lucene大数据模糊查询

      大数据模糊查询lucene 对工作单使用 like模糊查询时,实际上 数据库内部索引无法使用 ,需要逐条比较查询内容,效率比较低在数据量很多情况下, 提供模糊查询性能,我们可以使用lucene全文 ...

  3. SQL Server 2014 Agent 无法启动

    - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">- <System& ...

  4. rpc 理解

    RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现. rpc是一种概念,http也是 ...

  5. Android中<uses-sdk>属性和target属性分析

    1. 概要 <uses-sdk> 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本.通过在manifest清单文件中添加该属性,我们可以更好的控制 ...

  6. 基于html5和jquery的篮球跳动游戏

    今天给大家分享一款基于html5和jquery的篮球跳动游戏.这款实例和之前分享的HTML5重力感应小球冲撞动画类似.用鼠标拖动篮球,篮球在页面上跳动,可在演示中看下效果.效果图如下: 在线预览    ...

  7. ResourceBundle读取utf-8格式properties 中文乱码

    解决方法: ResourceBundle prop = ResourceBundle.getBundle("app");String defaultTunnelName = new ...

  8. myeclipse工程重名后怎么更改deploy location?

    http://zhidao.baidu.com/link?url=I9E16OYfxovPHqBrRWhYCI9TYNG_X-Whg_X7QrJiOBXBGEwi-6WYsC-Zi4Jcg9zd3ye ...

  9. 你真的需要一个jQuery插件吗

    jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错 ...

  10. UDP也需要现有Server端,然后再有Client端

    UDP编程: DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流. DatagramPacket(信件):数据包,是UDP下进行传输数 ...