到这里,大概的YII开发已经基本可以,但是下面要将的所有课程,学完之后可以让你更爱YII。下面的教程是讲的MVC的M,model。数据,业务,代码的集中地区。所以开始之前,学学开发规范-路径别名-命名空间-,来写出自己爱看,别人能看的代码。开发规范对于一个php开发这来说还是很无奈的。这里不多说了,规则不是我定的,我的目的就是在这里罗列一点,来说说什么是规范。尽管我写的代码只有我自己爱看。
YII官方给出了四篇文档来说明:
路径别名、名字空间:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.namespace
开发规范:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.convention
开发流程:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.workflow
最佳MVC实践:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.best-practices
这四个文档谁然描述的内容很少。但是所有要说明的大体都讲了一下。下面作一些简单的排列组合。
///////////////////////////////////////////////////////////////////////////
路径别名与名字空间
Yii 中广泛的使用了路径别名。路径别名关联于一个目录或文件的路径。它以点号语法指定,类似于广泛使用的名字空间(namespace)格式:
RootAlias.path.to.target
其中的 RootAlias
是某个现存目录的别名。
1. Root Alias
为方便起见,Yii 预定义了以下几个根别名:
system
: 表示 Yii 框架目录;zii
: 表示 Zii 库 目录;application
: 表示应用的 基础目录;webroot
: 表示 入口脚本 文件所在的目录。此别名从版本 1.0.3 开始有效。ext
: 表示包含了所有第三方 扩展 的目录。此别名从版本 1.0.8 开始有效。
额外的,如果应用使用了 模块, (Yii) 也为每个模块ID定义了根别名,指向相应模块的跟目录。 此功能从版本 1.0.3 起有效。
通过使用 YiiBase::getPathOfAlias(), 别名可以被翻译为其相应的路径。 例如, system.web.CController
会被翻译为 yii/framework/web/CController
。
2. Importing Classes
使用别名可以很方便的导入类的定义。 例如,如果我们想包含 CController 类的定义,我们可以调用如下代码
Yii::import(‘system.web.CController‘);
import 方法跟 include
和 require
不同,它更加高效。 导入(import)的类定义并不会真正被包含进来,直到它第一次被引用。 多次导入同样的名字空间也会比 include_once
和 require_once
快得多。
提示: 当引用 Yii 框架定义的类时,我们不需要导入或包含它。所有的核心 Yii 类都已被提前导入了。
使用Class Map
从1.1.5版本开始,Yii允许用户定义的类通过使Class Map机制来预先导入,这也是Yii内置类使用的方法。 预先引入机制可以在Yii应用的任何地方使用,无需显式地导入或者包含文件。这个特性对于一个建立在Yii基础上的框架或者类库来说很有用。
若要使用预导入功能,要在CWebApplication::run()执行前执行下面的代码:
Yii::$classMap=array( ‘ClassName1‘ => ‘path/to/ClassName1.php‘, ‘ClassName2‘ => ‘path/to/ClassName2.php‘, ...... );
3. 导入目录
我们还可以使用如下语法导入整个目录,这样此目录下的类文件就会在需要时被自动包含。
Yii::import(‘system.web.*‘);
除 import 外, 别名还在其他许多地方指向类。 例如,路径别名可以传递给 Yii::createComponent() 以创建相应类的实例。 即使类文件在之前从未被包含。
4. Namespace
不要将路径别名和名字空间混淆了,名字空间是指对一些类名的一个逻辑组合,这样它们就可以相互区分开,即使有相同的名字。 而路径别名是用于指向一个类文件或目录。路径别名与名字空间并不冲突。
提示: 由于 5.3.0 版本之前的 PHP 本质上不支持名字空间,你无法创建两个具有相同名字但不同定义的类的实例。 鉴于此,所有的 Yii 框架类都以字母 ‘C‘(意为 ‘Class‘) 作前缀,这样它们可以区分于用户定义的类。我们建议前缀 ‘C‘ 只保留给 Yii 框架使用,用户定义的类则使用其他的字母作前缀。
5. 使用命名空间的类
使用命名空间的类是指一个在非全局命名空间下声明的类。比如说,类application\components\GoogleMap
在命名空间application\components
下的类。使用命名空间需要 PHP 5.3.0 或者以上版本。
从1.1.5开始,可以无需显式引入而使用一个包含命名空间的类。比如说,我们可以创建一个application\components\GoogleMap
的实例而无需去处理引入的路径,这样就增强了Yii的自动导入机制。
若要自动导入使用命名空间的类,命名空间的格式必须和路径别名相似。比如说,类application\components\GoogleMap
所对应的路径必须和别名application.components.GoogleMap
一致。
////////////////////////////////////////////////////////////////////////////////////////////////
路径别名的和命名空间的总结
如果php对这方面做的和java一样好,估计yii框架就不会这么麻烦的定义这两个东西了。所以YII定义这两个东西其实主要是为了弥补php的这方面的不足。
1.命名空间和路径别名的区别
名字空间是指对一些类名的一个逻辑组合,这样它们就可以相互区分开,即使有相同的名字。
路径别名是用于指向一个类文件或目录。
2.记住YII提供的几个yii框架自己的路径别名,因为以后会常常用到。system zii application webroot ext
3.路径别名的定义
// define a path alias
// Yii::setPathOfAlias(‘local‘,‘path/to/local-folder‘);
//get
// Yii::getPathOfAlias(‘local‘);
4.路径别名的使用YII提供的require、include方法,是用函数Yii::import();
一种是导入一个类
Yii::import(‘system.web.CController‘);
一种是导入某个目录下的所有类
Yii::import(‘system.web.*‘);
5.至于命名空间,需要5.3以上的PHP支持,目前不推荐使用。
///////////////////////////////////////////////////////////////////////
开发规范
Yii 偏爱规范胜于配置。遵循规范可使你能够创建成熟的Yii应用而不需要编写、维护复杂的配置。 当然了,在必要时,Yii 仍然可以在几乎所有的方面通过配置实现自定义。
下面我们讲解 Yii 编程中推荐的开发规范。 为简单起见,我们假设WebRoot
是 Yii 应用安装的目录。
1. URL
默认情况下,Yii 识别如下格式的 URL:
http://hostname/index.php?r=ControllerID/ActionID
GET 变量意为 路由(route) ,它可以被Yii解析为 控制器和动作。 如果 ActionID
被省略,控制器将使用默认的动作(在CController::defaultAction中定义); 如果 ControllerID
也被省略(或者 r
变量不存在),应用将使用默认的控制器 (在CWebApplication::defaultController中定义)。
通过 CUrlManager 的帮助,可以创建更加可识别,更加 SEO 友好的 URL,例如http://hostname/ControllerID/ActionID.html
。此功能在 URL Management 中有详细讲解。
2. 代码
Yii 推荐命名变量、函数和类时使用 驼峰风格,即每个单词的首字母大写并连在一起,中间无空格。 变量名和函数名应该使它们的第一个单词全部小写,以使其区别于类名(例如:$basePath
, runController()
,LinkPager
)。
对私有类成员变量来说,我们推荐以下划线作为其名字前缀(例如: $_actionList
)。
由于在 PHP 5.3.0 之前不支持名字空间,我们推荐类要通过某种独立的方式命名,以避免和第三方类发生冲突。鉴于此, 所有的 Yii 框架类名以 "C" 作前缀。
一个针对控制器名字的特殊规则是它们必须以单词 Controller
结尾。那么控制器 ID 即类名的首字母小写并去掉单词 Controller
。 例如,PageController
类的 ID 就是 page
。这个规则使应用更加安全。它还使控制器相关的URL更加简单(例如 /index.php?r=page/index
而不是 /index.php?r=PageController/index
)。
3. 配置
配置是一个键值对数组。每个键代表了所配置的对象中的属性名,每个值则为相应属性的初始值。 例如,array(‘name‘=>‘My application‘, ‘basePath‘=>‘./protected‘)
初始化了 name
和 basePath
属性为它们相应的数组值。
类中任何可写的属性都可以被配置。如果没有配置,属性将使用它们的默认值。 当配置一个属性时,最好阅读相应文档以保证初始值正确。
4. 文件
命名和使用文件的规范取决于它们的类型。
类文件应以它们包含的公有类命名。例如, CController 类位于 CController.php
文件中。
公有类是可以被任何其他类使用的类。每个类文件应包含最多一个公有类。
私有类(只能被一个公有类使用的类)可以放在使用此类的公有类所在的文件中。
视图文件应以视图的名字命名。例如, index
视图位于 index.php
文件中。 视图文件是一个PHP脚本文件,它包含了用于呈现内容的 HTML和PHP代码。
配置文件可以任意命名。 配置文件是一个PHP脚本,它的主要目的是返回一个体现配置的关联数组。
5. 目录
Yii 假定了一系列默认的目录用于不同的场合。如果需要,每个目录都可以自定义。
WebRoot/protected
: 这是 应用基础目录, 是放置所有安全敏感的PHP脚本和数据文件的地方。Yii 有一个默认的application
别名指向此目录。 此目录及目录中的文件应该保护起来防止Web用户访问。它可以通过 CWebApplication::basePath 自定义。WebRoot/protected/runtime
: 此目录放置应用在运行时产生的私有临时文件。 此目录必须对 Web 服务器进程可写。它可以通过 CApplication::runtimePath自定义。WebRoot/protected/extensions
: 此目录放置所有第三方扩展。 它可以通过 CApplication::extensionPath自定义。WebRoot/protected/modules
: 此目录放置所有的应用 模块,每个模块使用一个子目录。WebRoot/protected/controllers
: 此目录放置所有控制器类文件。 它可以通过CWebApplication::controllerPath 自定义。WebRoot/protected/views
: 此目录放置所有试图文件, 包含控制器视图,布局视图和系统视图。 它可以通过 CWebApplication::viewPath 自定义。WebRoot/protected/views/ControllerID
: 此目录放置单个控制器类中使用的视图文件。 此处的ControllerID
是指控制器的 ID 。它可以通过 CController::viewPath 自定义。WebRoot/protected/views/layouts
: 此目录放置所有布局视图文件。它可以通过CWebApplication::layoutPath 自定义。WebRoot/protected/views/system
: 此目录放置所有系统视图文件。 系统视图文件是用于显示异常和错误的模板。它可以通- 过 CWebApplication::systemViewPath 自定义。
WebRoot/assets
: 此目录放置公共资源文件。 资源文件是可以被发布的,可由Web用户访问的私有文件。此目录必须对 Web 服务器进程可写。 它可以通过 CAssetManager::basePath 自定义WebRoot/themes
: 此目录放置应用使用的不同的主题。每个子目录即一个主题,主题的名字即目录的名字。 它可以通过 CThemeManager::basePath 自定义。
6. 数据库
多数Web 应用是由数据库驱动的。为了最佳时间,我们 推荐在对表和列命名时使用如下命名规范。注意,这些规范并不是 Yii 所必须的。
- 数据库表名和列名都使用小写命名。
- 名字中的单词应使用下划线分割 (例如
product_order
)。 - 对于表名,你既可以使用单数也可以使用复数。但 不要 同时使用两者。为简单起见,我们推荐使用单数名字。
- 表名可以使用一个通用前缀,例如
tbl_
。这样当应用所使用的表和另一个应用说使用的表共存于同一个数据库中时就特别有用。 这两个应用的表可以通过使用不同的表前缀很容易地区别开。
////////////////////////////////////////////////////////////////////////////////////
开发规范 总结红色标记
/////////////////////////////////////////////////////////////////////////////
开发流程
介绍过 Yii 中的基本概念之后,我们现在讲解使用 Yii 开发Web应用时的一般开发流程。 此处的开发流程假设我们已经完成了对应用的需求分析和必要的设计分析。
- 创建目录结构骨架。创建第一个Web应用 中讲到的
yiic
工具可以快速实现此步骤。 - 配置此 应用。这是通过修改应用配置文件实现的。 此步骤可能也需要编写一些应用组件(例如用户组件)。
- 为所管理的每个类型的数据创建一个 模型 类。 Creating First Yii Application 和 Automatic Code Generation中讲述的
Gii
工具可以用于快速为每个数据表创建 active record 类。4.为每个类型的用户请求 创建一个 控制器 类。 具体如何对用户请求归类要看实际需求。总体来说,如果一个模型类需要被用户访问,他就应该有一个相应的控制器类。
Gii
工具也可以自动实现这一步骤。 - 实现 动作 和他们相应的 视图。 这是真正所需要做的工作。
- 在控制器类中配置必要的动作 过滤器。
- 如果需要主题功能,创建 主题 。
- 如果需要 国际化(I18N) ,创建翻译信息。
- 对可缓存的数据点和视图点应用适当的 缓存 技术。
- 最终 调整 与部署。
上述的每个步骤中,可能需要创建并执行测试用例。
///////////////////////////////////////////////////////////////////////////////