7:Yii中的Gii与Url处理(Yii权威指南)
2013-05-04 03:08
267 查看
代码自动生成
从1.1.2版本开始,Yii包含一个代码生成工具Gii。它取代了以前的yiic shell命令行。现在我们开始描述如何使用Gii和如何扩展Gii。
使用Gii
Gii是一个模块,必须在Yii Application里面存在,使用Gii,我们首先要修改应用配置文件开启Gii:
在上面,我们指定了gii模块的位置,可以给它设置一个密码,默认gii只允许localhost,如果我们需要增加一些信任的主机则需要设置ipFilters属性。 GiiModule::ipFilters property
as shown in the above code.
注:Gii主要是作为一个开发环境,如果移植到了生产环境,最好关掉此功能,不然会很不安全。
我们可以通过URL
来进入gii。
如果我们的Yii Application使用了path-format。这我们可以通过Url
进入Gii。但是我们需要增加以下 Url 规则在url rules里面:
扩展Gii(Extending Gii)
有时候我们想要Gii生成的代码支持多种Language,所以我们必须来扩展它。
代码生成的文件保存在如下的目录里面:yii/framework/gii/generators/
寻找生成文件(Generator Search Path)
Gii被 GiiModule::generatorPaths 属性指定寻找代码生成文件,当我们自定义后,我们可以在Application
Configuration 里面配置这个属性:
上面的配置指定Gii在application.gii目录下面寻找生成文件,默认的路径是system.gii.generators。
URL Management(网址管理)
Web应用程序完整的URL管理包括两个方面。首先, 当用户请求约定的URL,应用程序需要解析 它变成可以理解的参数。第二,应用程序需求提供一种创造URL的方法,以便创建的URL应用程序可以理解的。对于Yii应用程序,这些通过CUrlManager辅助完成。
创建Url
虽然URL可被硬编码在控制器的视图(view)文件,但往往可以很灵活地动态创建它们:
默认情况下,URL以
我们可以使上述网址看起来更简洁,更不言自明,通过采用所谓的'
要更改URL格式,我们应该配置urlManager应用元件,以便createUrl可以自动切换到新格式和应用程序可以正确理解新的网址:
请注意,我们不需要指定的urlManager元件的类,因为它在CWebApplication预声明为CUrlManager。
注:提示:此网址通过createurl方法所产生的是一个相对地址。为了得到一个绝对的url ,我们可以用前缀yii: :app()->hostInfo,或调用createAbsoluteUrl 。
用户友好的Url(User Friendly Urls)
当用
要指定的URL规则,我们必须设定urlManager 应用元件的属性rules:
这些规则以一系列的路线格式对数组指定,每对对应于一个单一的规则。路线(route)的格式必须是有效的正则表达式,没有分隔符和修饰语。它是用于匹配网址的路径信息部分。还有route应指向一个有效的路线控制器。
规则可以绑定少量的GET参数。这些出现在规则格式的GET参数,以一种特殊令牌格式表现如下:
在上面的rules中,列出了许多选项,在1.1.0的版本中,存在以下选项:
urlSuffix: Url路径的后缀.,默认是NULL,使用这个选项 CUrlManager::urlSuffix.
caseSensitive: 是否是大小写敏感,默认是空,使用这个选项CUrlManager::caseSensitive.
defaultParams:rules默认提供的GET 参数(name => value).当这个选项设置后,对请求的URL,会把这个指定的值注入$_GET中。
matchValue:在创建一个URL的时候,是否这个GET参数的值在rule里面符合相应的子规则。默认是NULL。
使用命名参数(Using Named Parameters)
我们使用一些例子来解释网址工作规则。我们假设我们的规则(在urlManager的rules里面设置)包括如下三个:
调用
调用
调用
调用
如果GET参数传递到createUrl是以上所要求的一项规则,其他参数将出现在查询字符串。例如,如果我们调用
因此,该规则
正如我们提到的,URL规则的其他用途是解析请求网址。当然,这是URL生成的一个逆过程。例如, 当用户请求
。
隐藏index.php入口文件
还有一点,我们可以做进一步清理我们的网址,即在URL中藏匿
我们首先需要配置Web服务器,这样一个URL没有入口脚本仍然可以处理入口脚本。如果是Apache
HTTP server,可以通过打开网址重写引擎和指定一些重写规则。这两个操作可以在包含入口脚本的目录下的
All)
然后,我们设定urlManager元件的showScriptName属性为
我们还可以添加一些网址的后缀。例如,我们可以用
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName' => false,
'urlSuffix' => '.html',
),
注意: Yii从1.1.8版本起支持自定义URL规则类
默认情况下,每个URL规则都通过CUrlManager来声明为一个CUrlRule对象,这个对象会解析当前请求并根据具体的规则来生成URL。
虽然CUrlRule可以处理大部分URL格式,但在某些特殊情况下仍旧有改进余地。
比如,在一个汽车销售网站上,可能会需要支持类似
我们可以通过继承CUrlRule的方式来创造一个新的URL规则类。并且使用这个类解析一个或者多个规则。 以上面提到的汽车销售网站为例,我们可以声明下面的URL规则。
从以上可以看到,我们自定义了一个URL规则类
这个类可以这么写:
自定义URL规则类必须实现在CBaseUrlRule中定义的两个接口。
CBaseUrlRule::createUrl()
CBaseUrlRule::parseUrl()
除了这种典型用法,自定义URL规则类还可以有其他的用途。比如,我们可以写一个规则类来记录有关URL解析和UEL创建的请求。 这对于正在开发中的网站来说很有用。我们还可以写一个规则类来在其他URL规则都匹配失败的时候显示一个自定义404页面。 注意,这种用法要求规则类在所有其他规则的最后声明。
从1.1.2版本开始,Yii包含一个代码生成工具Gii。它取代了以前的yiic shell命令行。现在我们开始描述如何使用Gii和如何扩展Gii。
使用Gii
Gii是一个模块,必须在Yii Application里面存在,使用Gii,我们首先要修改应用配置文件开启Gii:
return array( ...... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'pick up a password here', 'ipFilters'=>array('127.0.0.1','::1'), // 'newFileMode'=>0666, // 'newDirMode'=>0777, ), ), );
在上面,我们指定了gii模块的位置,可以给它设置一个密码,默认gii只允许localhost,如果我们需要增加一些信任的主机则需要设置ipFilters属性。 GiiModule::ipFilters property
as shown in the above code.
注:Gii主要是作为一个开发环境,如果移植到了生产环境,最好关掉此功能,不然会很不安全。
我们可以通过URL
http://hostname/path/to/index.php?r=gii.
来进入gii。
如果我们的Yii Application使用了path-format。这我们可以通过Url
http://hostname/path/to/index.php/gii.
进入Gii。但是我们需要增加以下 Url 规则在url rules里面:
'components'=>array( ...... 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'gii'=>'gii', 'gii/<controller:\w+>'=>'gii/<controller>', 'gii/<controller:\w+>/<action:\w+>'=>'gii/<controller>/<action>', ...existing rules... ), ), )
扩展Gii(Extending Gii)
有时候我们想要Gii生成的代码支持多种Language,所以我们必须来扩展它。
代码生成的文件保存在如下的目录里面:yii/framework/gii/generators/
model/ the model generator root folder ModelCode.php the code model used to generate code ModelGenerator.php the code generation controller views/ containing view scripts for the generator index.php the default view script templates/ containing code template sets default/ the 'default' code template set model.php the code template for generating model class code
寻找生成文件(Generator Search Path)
Gii被 GiiModule::generatorPaths 属性指定寻找代码生成文件,当我们自定义后,我们可以在Application
Configuration 里面配置这个属性:
return array( 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'generatorPaths'=>array( 'application.gii', // a path alias ), ), ), );
上面的配置指定Gii在application.gii目录下面寻找生成文件,默认的路径是system.gii.generators。
URL Management(网址管理)
Web应用程序完整的URL管理包括两个方面。首先, 当用户请求约定的URL,应用程序需要解析 它变成可以理解的参数。第二,应用程序需求提供一种创造URL的方法,以便创建的URL应用程序可以理解的。对于Yii应用程序,这些通过CUrlManager辅助完成。
创建Url
虽然URL可被硬编码在控制器的视图(view)文件,但往往可以很灵活地动态创建它们:
$url=$this->createUrl($route,$params);
$this指的是控制器实例;
$route指定请求的route 的要求;
$params列出了附加在网址中的
GET参数。
默认情况下,URL以
get格式使用createUrl 创建。例如,提供
$route='post/read'和
$params=array('id'=>100),我们将获得以下网址:
/index.php?r=post/read&id=100
我们可以使上述网址看起来更简洁,更不言自明,通过采用所谓的'
path格式,省去查询字符串和把GET参数加到路径信息,作为网址的一部分:
/index.php/post/read/id/100
要更改URL格式,我们应该配置urlManager应用元件,以便createUrl可以自动切换到新格式和应用程序可以正确理解新的网址:
array( ...... 'components'=>array( ...... 'urlManager'=>array( 'urlFormat'=>'path', ), ), );
请注意,我们不需要指定的urlManager元件的类,因为它在CWebApplication预声明为CUrlManager。
注:提示:此网址通过createurl方法所产生的是一个相对地址。为了得到一个绝对的url ,我们可以用前缀yii: :app()->hostInfo,或调用createAbsoluteUrl 。
用户友好的Url(User Friendly Urls)
当用
path格式URL,我们可以指定某些URL规则使我们的网址更用户友好性。例如,我们可以产生一个短短的URL
/post/100,而不是冗长
/index.php/post/read/id/100。网址创建和解析都是通过CUrlManager指定网址规则。
要指定的URL规则,我们必须设定urlManager 应用元件的属性rules:
array( ...... 'components'=>array( ...... 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'pattern1'=>'route1', 'pattern2'=>'route2', 'pattern3'=>'route3', ), ), ), );
这些规则以一系列的路线格式对数组指定,每对对应于一个单一的规则。路线(route)的格式必须是有效的正则表达式,没有分隔符和修饰语。它是用于匹配网址的路径信息部分。还有route应指向一个有效的路线控制器。
规则可以绑定少量的GET参数。这些出现在规则格式的GET参数,以一种特殊令牌格式表现如下:
'pattern1'=>array('route1', 'urlSuffix'=>'.xml', 'caseSensitive'=>false)
在上面的rules中,列出了许多选项,在1.1.0的版本中,存在以下选项:
urlSuffix: Url路径的后缀.,默认是NULL,使用这个选项 CUrlManager::urlSuffix.
caseSensitive: 是否是大小写敏感,默认是空,使用这个选项CUrlManager::caseSensitive.
defaultParams:rules默认提供的GET 参数(name => value).当这个选项设置后,对请求的URL,会把这个指定的值注入$_GET中。
matchValue:在创建一个URL的时候,是否这个GET参数的值在rule里面符合相应的子规则。默认是NULL。
使用命名参数(Using Named Parameters)
<ParamName:ParamPattern>
ParamName表示GET参数名字,可选项
ParamPattern表示将用于匹配GET参数值的正则表达式。当生成一个网址(URL)时,这些参数令牌将被相应的参数值替换;当解析一个网址时,相应的GET参数将通过解析结果来生成。
我们使用一些例子来解释网址工作规则。我们假设我们的规则(在urlManager的rules里面设置)包括如下三个:
array( 'posts'=>'post/list', 'post/<id:\d+>'=>'post/read', 'post/<year:\d{4}>/<title>'=>'post/read', )
调用
$this->createUrl('post/list')生成
/index.php/posts。第一个规则适用。
调用
$this->createUrl('post/read',array('id'=>100))生成
/index.php/post/100。第二个规则适用。
调用
$this->createUrl('post/read',array('year'=>2008,'title'=>'a sample post'))生成
/index.php/post/2008/a%20sample%20post。第三个规则适用。
调用
$this->createUrl('post/read')产生
/index.php/post/read。请注意,没有规则适用。
如果GET参数传递到createUrl是以上所要求的一项规则,其他参数将出现在查询字符串。例如,如果我们调用
$this->createUrl('post/read',array('id'=>100,'year'=>2008)),我们将获得
/index.php/post/100?year=2008。为了使这些额外参数出现在路径信息的一部分,我们应该给规则附加
/*。
因此,该规则
post/<id:\d+>/*,我们可以获取网址
/index.php/post/100/year/2008。
正如我们提到的,URL规则的其他用途是解析请求网址。当然,这是URL生成的一个逆过程。例如, 当用户请求
/index.php/post/100,上面例子的第二个规则将适用来解析路线
post/read和GET参数
array('id'=>100)(可通过
$_GET获得)
。
隐藏index.php入口文件
还有一点,我们可以做进一步清理我们的网址,即在URL中藏匿
index.php入口脚本。这就要求我们配置Web服务器,以及urlManager应用程序元件。
我们首先需要配置Web服务器,这样一个URL没有入口脚本仍然可以处理入口脚本。如果是Apache
HTTP server,可以通过打开网址重写引擎和指定一些重写规则。这两个操作可以在包含入口脚本的目录下的
.htaccess文件里实现。下面是一个示例:(注意,前提是请确定服务器的AllowOverride
All)
Options +FollowSymLinks IndexIgnore */* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # otherwise forward it to index.php RewriteRule . index.php
然后,我们设定urlManager元件的showScriptName属性为
false。
Faking URL Suffix(伪造URL后缀)
我们还可以添加一些网址的后缀。例如,我们可以用/post/100.html来替代
/post/100。这使得它看起来更像一个静态网页URL。为了做到这一点,只需配置urlManager元件的urlSuffix属性为你所喜欢的后缀。
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName' => false,
'urlSuffix' => '.html',
),
使用自定义URL规则设置类
注意: Yii从1.1.8版本起支持自定义URL规则类默认情况下,每个URL规则都通过CUrlManager来声明为一个CUrlRule对象,这个对象会解析当前请求并根据具体的规则来生成URL。
虽然CUrlRule可以处理大部分URL格式,但在某些特殊情况下仍旧有改进余地。
比如,在一个汽车销售网站上,可能会需要支持类似
/Manufacturer/Model这样的URL格式, 其中
Manufacturer和
Model都各自对应数据库中的一个表。此时CUrlRule就无能为力了。
我们可以通过继承CUrlRule的方式来创造一个新的URL规则类。并且使用这个类解析一个或者多个规则。 以上面提到的汽车销售网站为例,我们可以声明下面的URL规则。
array( // 一个标准的URL规则,将 '/' 对应到 'site/index' '' => 'site/index', // 一个标准的URL规则,将 '/login' 对应到 'site/login', 等等 '<action:(login|logout|about)>' => 'site/<action>', // 一个自定义URL规则,用来处理 '/Manufacturer/Model' array( 'class' => 'application.components.CarUrlRule', 'connectionID' => 'db', ), // 一个标准的URL规则,用来处理 'post/update' 等 '<controller:\w+>/<action:\w+>' => '<controller>/<action>', ),
从以上可以看到,我们自定义了一个URL规则类
CarUrlRule来处理类似
/Manufacturer/Model这样的URL规则。
这个类可以这么写:
class CarUrlRule extends CBaseUrlRule{ public $connectionID = 'db'; public function createUrl($manager,$route,$params,$ampersand) { if ($route==='car/index') { if (isset($params['manufacturer'], $params['model'])) return $params['manufacturer'] . '/' . $params['model']; else if (isset($params['manufacturer'])) return $params['manufacturer']; } return false; // this rule does not apply } public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) { if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) { // check $matches[1] and $matches[3] to see // if they match a manufacturer and a model in the database // If so, set $_GET['manufacturer'] and/or $_GET['model'] // and return 'car/index' } return false; // this rule does not apply }}
自定义URL规则类必须实现在CBaseUrlRule中定义的两个接口。
CBaseUrlRule::createUrl()
CBaseUrlRule::parseUrl()
除了这种典型用法,自定义URL规则类还可以有其他的用途。比如,我们可以写一个规则类来记录有关URL解析和UEL创建的请求。 这对于正在开发中的网站来说很有用。我们还可以写一个规则类来在其他URL规则都匹配失败的时候显示一个自定义404页面。 注意,这种用法要求规则类在所有其他规则的最后声明。
相关文章推荐
- Yii 2.0 权威指南 (4) 使用 Gii 生成代码
- 9:Yii中的主题、日志、性能分析以及错误处理(Yii权威指南)
- Yii 2.0 权威指南 (6) 请求处理
- 1:创建Yii(Yii权威指南)
- 2:Yii基础知识(Yii权威指南)
- 4:使用数据库的DAO和AR(Yii权威指南)
- Yii框架官方指南系列43——专题:URL(创建、路由、美化及自定义)
- 4:使用数据库的表连接(Yii权威指南)
- yii 2.0中文 权威指南
- Yii 2.0 权威指南(3) 使用数据库
- Yii框架2.0中文权威指南 - 在线手册发布
- 5:缓存(Yii权威指南)
- 6:扩展Yii(Yii权威指南)
- Yii框架官方指南系列46——专题:错误处理
- Yii 2.0 权威指南 (8) 配合数据库使用
- Yii权威指南
- Squid中文权威指南 第十六章(调试和故障处理 )
- Yii 2.0 权威指南(1) 第一次问候
- js权威指南之事件和事件处理
- Node.js权威指南 (5) - 使用Buffer类处理二进制数据