yii基础知识-
2014-01-19 21:31
148 查看
控制器是
动作的最简形式,就是一个名字以
action开头的控制器类方法。
控制器通常有一个默认的动作。当用户的请求未指定要执行的动作时,默认动作将被执行。默认情况下,默认的动作名为
index。它可以通过设置
如下是一个控制器类所需的最简代码。由于此控制器未定义任何动作,对它的请求将抛出一个异常。
classSiteControllerextendsCController { }
1.路由
控制器和动作以ID识别。控制器ID是一种'path/to/xyz'的格式,对应相应的控制器类文件protected/controllers/path/to/XyzController.php,其中的标志
xyz应被替换为实际的名字(例如
post对应
protected/controllers/PostController.php).动作ID是除去
action前缀的动作方法名。例如,如果一个控制器类含有一个名为
actionEdit的方法,则相应的动作ID为
edit。
用户以路由的形式请求特定的控制器和动作。路由是由控制器ID和动作ID连接起来的,两者以斜线分割。例如,路由
post/edit代表
PostController及其
edit动作。默认情况下,URL
http://hostname/index.php?r=post/edit即请求此控制器和动作。
注意:默认情况下,路由是大小写敏感的,从版本1.0.1开始,可以通过设置应用配置中的
从1.0.3版本开始,应用可以含有
moduleID/controllerID/actionID。更多详情,请阅读
2.控制器实例化
控制器实例在如果指定了
如果在
如果ID为
'path/to/xyz'的格式,控制器类的名字将判断为
XyzController,相应的类文件则为
protected/controllers/path/to/XyzController.php。例如,控制器ID
admin/user将被解析为控制器类
UserController,类文件是
protected/controllers/admin/UserController.php。如果类文件不存在,将触发一个404
在使用了
3.动作
如前文所述,动作可以被定义为一个以action单词作为前缀命名的方法。而更高级的方式是定义一个动作类并让控制器在收到请求时将其实例化。这使得动作可以被复用,提高了可复用度。
要定义一个新动作类,可用如下代码:
classUpdateActionextendsCAction { publicfunctionrun() { //placetheactionlogichere } }
为了让控制器注意到这个动作,我们要用如下方式覆盖控制器类的
classPostControllerextendsCController { publicfunctionactions() { returnarray( 'edit'=>'application.controllers.post.UpdateAction', ); } }
如上所示,我们使用了路径别名
application.controllers.post.UpdateAction指定动作类文件为
protected/controllers/post/UpdateAction.php.
通过编写基于类的动作,我们可以将应用组织为模块的风格。例如,如下目录结构可用于组织控制器相关代码:
protected/ controllers/ PostController.php UserController.php post/ CreateAction.php ReadAction.php UpdateAction.php user/ CreateAction.php ListAction.php ProfileAction.php UpdateAction.php
动作参数绑定
从版本1.1.4开始,Yii提供了对自动动作参数绑定的支持。就是说,控制器动作可以定义命名的参数,参数的值将由Yii自动从$_GET填充。
为了详细说明此功能,假设我们需要为
PostController写一个
create动作。此动作需要两个参数:
category:一个整数,代表帖子(post)要发表在的那个分类的ID。
language:一个字符串,代表帖子所使用的语言代码。
从
$_GET中提取参数时,我们可以不再下面这种无聊的代码了:
classPostControllerextendsCController { publicfunctionactionCreate() { if(isset($_GET['category'])) $category=(int)$_GET['category']; else thrownewCHttpException(404,'invalidrequest'); if(isset($_GET['language'])) $language=$_GET['language']; else $language='en'; //...funcodestartshere... } }
现在使用动作参数功能,我们可以更轻松的完成任务:
classPostControllerextendsCController { publicfunctionactionCreate($category,$language='en') { $category=(int)$category; //...funcodestartshere... } }
注意我们在动作方法
actionCreate中添加了两个参数。这些参数的名字必须和我们想要从
$_GET中提取的名字一致。当用户没有在请求中指定
$language参数时,这个参数会使用默认值
en。由于
$category没有默认值,如果用户没有在
$_GET中提供
category参数,将会自动抛出一个
classPostControllerextendsCController { publicfunctionactionCreate(array$categories) { //Yiiwillmakesure$categoriesbeanarray } }
Thatis,weaddthekeyword
arrayinfrontof
$categoriesinthemethodparameterdeclaration.Bydoingso,if
$_GET['categories']isasimplestring,itwillbeconvertedintoanarrayconsistingofthatstring.
Note:Ifaparameterisdeclaredwithoutthe
arraytypehint,itmeanstheparametermustbeascalar(i.e.,notanarray).Inthiscase,passinginanarrayparametervia
$_GETwouldcauseanHTTPexception.
4.过滤器
过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如,访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行
过滤器可以定义为一个控制器类的方法。方法名必须以
filter开头。例如,现有的
filterAccessControl方法定义了一个名为
accessControl的过滤器。过滤器方法必须为如下结构:
publicfunctionfilterAccessControl($filterChain) { //调用$filterChain->run()以继续后续过滤器与动作的执行。 }
其中的
$filterChain(过滤器链)是一个
$filterChain->run()以继续执行后续过滤器和动作。
过滤器也可以是一个
classPerformanceFilterextendsCFilter { protectedfunctionpreFilter($filterChain) { //动作被执行之前应用的逻辑 returntrue;//如果动作不应被执行,此处返回false } protectedfunctionpostFilter($filterChain) { //动作执行之后应用的逻辑 } }
要对动作应用过滤器,我们需要覆盖
CController::filters()方法。此方法应返回一个过滤器配置数组。例如:
classPostControllerextendsCController { ...... publicfunctionfilters() { returnarray( 'postOnly+edit,create', array( 'application.filters.PerformanceFilter-edit,create', 'unit'=>'second', ), ); } }
上述代码指定了两个过滤器:
postOnly和
PerformanceFilter。
postOnly过滤器是基于方法的(相应的过滤器方法已在
performanceFilter过滤器是基于对象的。路径别名
application.filters.PerformanceFilter指定过滤器类文件是
protected/filters/PerformanceFilter。我们使用一个数组配置
PerformanceFilter,这样它就可被用于初始化过滤器对象的属性值。此处
PerformanceFilter的
unit属性值将被初始为
second。
使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中,
postOnly应只被应用于
edit和
create动作,而
PerformanceFilter应被应用于除了
edit和
create之外的动作。如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。
相关文章推荐
- yii基础知识-应用
- Yii框架官方教程增补篇4——基础知识:模型-视图-控制器 (MVC)
- Yii框架官方教程增补篇5——基础知识:入口脚本
- Yii框架官方教程增补篇6——基础知识:应用、组件、配置、生命周期
- Yii框架官方指南系列7——基础知识:控制器
- Yii框架官方指南系列8——基础知识:模型
- 2:Yii基础知识(Yii权威指南)
- Yii框架官方指南系列9——基础知识:视图
- Yii框架官方指南系列10——基础知识:组件
- Yii框架官方系列指南系列11——基础知识:模块
- Yii框架官方指南系列12——基础知识:路径别名与名字空间
- Yii框架官方指南系列13——基础知识:开发规范
- Yii框架官方指南系列14——基础知识:开发流程
- Yii框架官方指南系列15——基础知识:最佳MVC实践
- 电力基础知识培训(三)
- 新手学习Linux的一些基础知识
- C/C++基础知识学习
- 网络基础知识小小说
- 模板笔记005 - 实战基础知识
- php 基础知识(一)