模块的实例可通过当前活动控制器的 module 属性访问。在模块实例中,我们可以访问在模块级中共享的信息。例如,为访问上面的 postPerPage 信息,我们可使用如下表达式:
$postPerPage=Yii::app()->controller->module->postPerPage; // 如如$this引用的是控制器实例,则可以使用下行语句 // $postPerPage=$this->module->postPerPage;
模块中的控制器动作可以通过路由“模块ID/控制器ID/动作ID”或“模块ID/存放控制器类文件的子目录名/控制器ID/动作ID”访问。例如,假设上面的 forum 模块有一个名为 PostController 的控制器,我们就可以通过路由 forum/post/create 访问此控制器中的 create 动作。此路由对应的 URL 即 ?r=forum/post/create。
3、嵌套的模块
模块可以无限级嵌套。这就是说,一个模块可以包含另一个模块,而这另一个模块又可以包含其他模块。我们称前者为 父模块 ,后者为子模块。子模块必须定义在其父模块的 modules 属性中,就像我们前面在应用配置中定义模块一样。
要访问子模块中的控制器动作,我们应使用路由 父模块ID/子模块ID/控制器ID/动作ID。
九、路径别名
Yii 中广泛的使用了路径别名。路径别名关联于一个目录或文件的路径。它以点号语法指定,类似于广泛使用的名字空间(namespace)格式:
RootAlias.path.to.target
其中的 RootAlias 是某个现存目录的别名,通过调用 YiiBase::setPathOfAlias(), 我们可以定义新的路径别名。为方便起见,Yii 预定义了以下几个根别名:
system: 表示 Yii 框架目录;
zii: 表示 Zii 库 目录;
application: 表示应用的 基础目录;
webroot: 表示 入口脚本 文件所在的目录。
ext: 表示包含了所有第三方 扩展 的目录。
额外的,如果应用使用了 模块, (Yii) 也为每个模块ID定义了根别名,指向相应模块的跟目录。
通过使用 YiiBase::getPathOfAlias(), 别名可以被翻译为其相应的路径。
使用别名可以很方便的导入类的定义。例如,如果我们想包含 CController 类的定义,我们可以调用如下代码
复制代码 代码如下:
Yii::import('system.web.CController');
import方法跟 include 和 require 不同,它更加高效。导入(import)的类定义并不会真正被包含进来,直到它第一次被引用。多次导入同样的名字空间也会比 include_once 和 require_once 快得多。
我们还可以使用如下语法导入整个目录,这样此目录下的类文件就会在需要时被自动包含。
复制代码 代码如下:
Yii::import('system.web.*');
除 import 外, 别名还在其他许多地方指向类。例如,路径别名可以传递给 Yii::createComponent() 以创建相应类的实例。即使类文件在之前从未被包含。
不要将路径别名和名字空间混淆了,名字空间是指对一些类名的一个逻辑组合,这样它们就可以相互区分开,即使有相同的名字。而路径别名是用于指向一个类文件或目录。路径别名与名字空间并不冲突。
十、开发规范
下面我们讲解 Yii 编程中推荐的开发规范。为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录。
1、URL
默认情况下,Yii 识别如下格式的 URL:
?r=ControllerID/ActionID
r 变量意为 路由(route) ,它可以被Yii解析为 控制器和动作。如果 ActionID 被省略,控制器将使用默认的动作(在CController::defaultAction中定义);如果 ControllerID 也被省略(或者 r 变量不存在),应用将使用默认的控制器(在CWebApplication::defaultController中定义)。
通过 CUrlManager 的帮助,可以创建更加可识别,更加 SEO 友好的 URL,例如 。
2、代码
Yii 推荐命名变量、函数和类时使用驼峰风格,即每个单词的首字母大写并连在一起,中间无空格。变量名和函数名应该使它们的第一个单词全部小写,以使其区别于类名。对私有类成员变量来说,我们推荐以下划线作为其名字前缀(例如: $_actionList)。
一个针对控制器类名的特殊规则是它们必须以单词 Controller 结尾。那么控制器ID就是类名的首字母小写并去掉单词Controller。例如,PageController类的ID就是 page。这个规则使应用更加安全。它还使控制器相关的URL更加简单(例如 /index.php?r=page/index 而不是 /index.php?r=PageController/index)。
3、配置
配置是一个键值对数组。每个键代表了所配置的对象中的属性名,每个值则为相应属性的初始值。
类中任何可写的属性都可以被配置。如果没有配置,属性将使用它们的默认值。当配置一个属性时,最好阅读相应文档以保证初始值正确。
4、文件
命名和使用文件的规范取决于它们的类型。