- 浏览: 338487 次
- 性别:
- 来自: 北京
博客专栏
-
高性能PHP框架Yii分析...
浏览量:84871
文章分类
最新评论
-
huxiaoyunhust:
价值观这种东西,说不好听是口号,其实是公司每天潜移默化的感染, ...
关于企业价值观的一点点感悟 -
silentime:
stef831018 写道你想多了,企业价值观就两个字:利益怎 ...
关于企业价值观的一点点感悟 -
stef831018:
你想多了,企业价值观就两个字:利益
关于企业价值观的一点点感悟 -
guoyuqiangf8:
关于企业价值观的一点点感悟 -
silentime:
mangguo 写道推荐大家去看看我写的python入门,可以 ...
python如何打印变量的类型
在分析yii webapplication执行之前,我们先来看看yii的路由管理类CUrlManager,很多框架都有路由的功能,通常情况是将controller和view的名称作为url的一部分传给入口程序,进而调用相应的controller和view进行处理,我们来分析一下yii是如何完成这样的工作的。
关于UrlManager的使用,可以参考Yii官方文档:
(http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.url),先看一下这个component的初始化代码:
class CUrlManager extends CApplicationComponent { const CACHE_KEY='Yii.CUrlManager.rules'; const GET_FORMAT='get'; const PATH_FORMAT='path'; public $cacheID='cache'; private $_urlFormat=self::GET_FORMAT; /** * Initializes the application component. */ public function init() { parent::init(); $this->processRules(); } /** * Processes the URL rules. */ protected function processRules() { //默认采用get格式 if(empty($this->rules) || $this->getUrlFormat()===self::GET_FORMAT) return; //如果使用缓存,并且能缓存组建可用,将url规则序列化之后以其md5值为缓存的键名获取键值,如果没有设置过,将其 if($this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null) { $hash=md5(serialize($this->rules)); if(($data=$cache->get(self::CACHE_KEY))!==false && isset($data[1]) && $data[1]===$hash) { $this->_rules=$data[0]; return; } } foreach($this->rules as $pattern=>$route) $this->_rules[]=$this->createUrlRule($route,$pattern); if(isset($cache)) $cache->set(self::CACHE_KEY,array($this->_rules,$hash)); } /** * Returns the URL format. * @return URL格式的字符串,默认是’path’,有效的形式包括’path’和’get’。 * Please refer to the guide for more details about the difference between these two formats. */ public function getUrlFormat() { return $this->_urlFormat; } /** * Creates a URL rule instance. * The default implementation returns a CUrlRule object. * @param string $route 规则的匹配部分 * @param mixed $pattern 规则的路由部分,可以是字符串,也可以是数组。 * @return CUrlRule the URL rule instance * @since 1.1.0 */ protected function createUrlRule($route,$pattern) { return new CUrlRule($route,$pattern); } }
其中的rules是在配置文件中进行配置的,参考本文yii官方文档中的介绍,典型的配置文件形式如下,格式(pattern)必须是有效的正则表达式,没有分隔符和修饰语。它是用于匹配网址的路径信息部分。还有route应指向一个有效的路线控制器(controllerID/actionID)。
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'pattern1'=>'route1',
'pattern2'=>'route2',
'pattern3'=>'route3',
),
),
rules的一个示例如下:
'pattern1'=>array('route1', 'urlSuffix'=>'.xml', 'caseSensitive'=>false)
yii的官方文档对此的解释如下:
• urlSuffix: 此规则使用的url后缀,默认使用CurlManger::urlSuffix,即为null。例如可以将此设置为.html,让url看起来“像”是一个静态页面。
• caseSensitive: 是否大小写敏感,默认使用CUrlManager::caseSensitive,即为null。
• defaultParams: 该规则使用的默认get参数。当使用该规则来解析一个请求时,这个参数的值会被注入到$_GET参数中。
• matchValue: 当创建一个URL时,GET参数是否匹配相应的子模式。默认使用CurlManager::matchValue,即为null。如果该属性为false,那么意味着当路由和参数名匹配给定的规则时,将以此来创建一个URL。如果该属性为true,那么给定的参数值夜必须匹配相应的参数子模式。注意:将此属性设置为true会降低性能。
那么,CUrlRule是如何实现url路由规则的呢?我们看一下CUrlRule的构造函数:
class CUrlRule extends CComponent { /** * Constructor. * @param string $route the route of the URL (controller/action) * @param string $pattern the pattern for matching the URL */ public function __construct($route,$pattern) { if(is_array($route)) { if(isset($route['urlSuffix'])) $this->urlSuffix=$route['urlSuffix']; if(isset($route['caseSensitive'])) $this->caseSensitive=$route['caseSensitive']; if(isset($route['defaultParams'])) $this->defaultParams=$route['defaultParams']; if(isset($route['matchValue'])) $this->matchValue=$route['matchValue']; $route=$this->route=$route[0]; } else $this->route=$route; $tr2['/']=$tr['/']='\\/'; if(strpos($route,'<')!==false && preg_match_all('/<(\w+)>/',$route,$matches2)) { foreach($matches2[1] as $name) $this->references[$name]="<$name>"; } $this->hasHostInfo=!strncasecmp($pattern,'http://',7) || !strncasecmp($pattern,'https://',8); if(preg_match_all('/<(\w+):?(.*?)?>/',$pattern,$matches)) { $tokens=array_combine($matches[1],$matches[2]); foreach($tokens as $name=>$value) { if($value==='') $value='[^\/]+'; $tr["<$name>"]="(?P<$name>$value)"; if(isset($this->references[$name])) $tr2["<$name>"]=$tr["<$name>"]; else $this->params[$name]=$value; } } $p=rtrim($pattern,'*'); $this->append=$p!==$pattern; $p=trim($p,'/'); $this->template=preg_replace('/<(\w+):?.*?>/','<$1>',$p); $this->pattern='/^'.strtr($this->template,$tr).'\/'; if($this->append) $this->pattern.='/u'; else $this->pattern.='$/u'; if($this->references!==array()) $this->routePattern='/^'.strtr($this->route,$tr2).'$/u'; if(YII_DEBUG && @preg_match($this->pattern,'test')===false) throw new CException(Yii::t('yii','The URL pattern "{pattern}" for route "{route}" is not a valid regular expression.', array('{route}'=>$route,'{pattern}'=>$pattern))); } /** * Parses the user request. * @param CHttpRequest $request the request application component * @return string the route (controllerID/actionID) and perhaps GET parameters in path format. */ public function parseUrl($request) { if($this->getUrlFormat()===self::PATH_FORMAT)//如果是‘path’形式 { $rawPathInfo=$request->getPathInfo(); $pathInfo=$this->removeUrlSuffix($rawPathInfo,$this->urlSuffix); foreach($this->_rules as $rule) { if(($r=$rule->parseUrl($this,$request,$pathInfo,$rawPathInfo))!==false) return isset($_GET[$this->routeVar]) ? $_GET[$this->routeVar] : $r; } if($this->useStrictParsing) throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".', array('{route}'=>$pathInfo))); else return $pathInfo; } else if(isset($_GET[$this->routeVar])) return $_GET[$this->routeVar]; else if(isset($_POST[$this->routeVar])) return $_POST[$this->routeVar]; else return ''; } }
事实上,路由规则主要是用于调用createurl时,更为有效地实现参数传递而使用的一种方式,最终还是转换成controllerID/actionID的形式。
发表评论
-
[转]PHP的内存管理
2015-05-11 22:03 883原文出处:http://blogread.cn/it/ar ... -
《高性能PHP应用开发》读书笔记
2014-12-24 09:20 793注:只记录了一些关键点,部分知识点/内容请看到的朋友 ... -
[转]HTTP缓存算法
2013-01-04 14:34 1349原文地址:http://www.p ... -
【转】漫谈社区PHP 业务开发
2012-11-19 10:07 1115原文地址:http://stblog.baidu-tech.c ... -
Yii分析13:Yii核心组件之AssetManager
2012-04-10 00:37 4394我们通过使用来讲解CAssetManager的使用和工 ... -
Yii分析12:Yii核心web组件之会话类CHttpSession
2012-03-06 09:44 3226CHttpSession提供session级的数据管理和配置 ... -
Yii分析11:Yii核心组件之错误处理类CErrorHandler
2012-02-24 09:57 4129类如其名,CErrorHandler在Yii中主要的功能 ... -
Yii分析10:Yii核心组件之数据库类CDbConnection
2012-02-17 09:18 8537数据库类几乎是每个PHP框架必不可少的组件之一,Yii的 ... -
Yii分析9:CController控制视图(Cview)的展现
2011-11-30 00:01 4875《The Definitive Guide to ... -
[转]优酷网架构学习笔记
2011-11-22 10:22 1444原文地址:http://www.itivy.com/ivy/a ... -
[转]YouTube架构学习体会
2011-11-22 10:15 1215原文地址:http://www.itivy.com/ivy/a ... -
[转]深掘XSS漏洞场景之XSS Rootkit
2011-10-21 12:22 1355转载顿神大作:http://www.80sec.com/%E6 ... -
Yii分析7:runController的执行
2011-10-20 17:28 6006在《Yii分析4:run的执行》一文中,介绍了Yi ... -
关于PHP错误:unexpected T_PAAMAYIM_NEKUDOTAYIM
2011-10-08 16:23 1957PHP解析错误:Parse error: syntax err ... -
[推荐]基于PHP和MySQL的开源点击统计软件Piwik
2011-08-10 11:50 1752刚刚发现一款基于PHP和MySQL的开源点击统计软 ... -
PHP的is_callable和method_exists方法比较
2011-08-03 13:17 2211之前发过一篇关于is_callable的文章,主要是PHP手册 ... -
Yii分析6:CHttpRequest
2011-08-03 11:20 2890官方说明:CHttpRequest封装了$_SERVER变量, ... -
[转]10种方式实现跨域资源的共享
2011-07-27 10:50 1060原文地址:http://www.ued16 ... -
[转]高级PHP应用程序漏洞审核技术
2011-07-19 10:18 1919原文地址:http://code.google.com/p/p ... -
使用PHP的SESSION直接保存对象需要注意隐含的序列化
2011-06-23 14:12 3389昨天在调试代码时,在同一个sever上有两个版本的代码,刚开始 ...
相关推荐
接下来,文章介绍了Yii2内置的两个主要的URL生成工具:URL管理器(urlManager)和URL助手类(yii\helpers\Url)。 URL管理器是一个名为urlManager的应用组件,通常在WEB应用和控制台应用中使用。它通过两种方式创建...
- 继承自`yii\web\Controller`类。 - **动作** - 控制器中的动作方法以`action`前缀命名。 - 动作方法的返回值即为响应数据。 ##### 3.3 模型 - **数据库操作模型** - 使用AR(Active Record)模式进行数据库...
Yii源码的分析对于理解其工作原理、优化代码以及自定义扩展功能至关重要。 首先,Yii 2是该框架的最新版本,其核心设计理念是简洁、高效和可扩展。它采用了面向对象的设计模式,如单例、工厂、策略等,使得代码组织...
- Yii2的`UrlManager`组件可以轻松处理RESTful路由。在`config/main.php`中配置路由规则: ```php 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'rules' => [ ['class' => ...
在学习和使用Yii2框架开发RESTful API时,灵活运用`yii\rest\UrlRule`以及自定义路由规则,能够帮助我们更好地管理项目中的路由结构,同时提高开发效率和程序的可维护性。对于希望深入了解Yii2路由系统的开发者,这...
关于路由和URL管理,Yii允许自定义URL规则,使得URL更加友好,如将`/blog/view?id=123`转换为`/blog/123`。这在`config/web.php`配置文件中的`'urlManager'`部分可以找到。 安全方面,Yii提供了用户认证和授权功能...
在Yii中,我们可以通过配置`urlManager`组件来实现这一功能,无需手动修改每个路由规则,只需将虚拟域名指向项目的根目录,框架会自动处理URL美化。 对于"不需要手动配置",Yii框架提供了一套强大的自动发现和配置...
Yii框架内置了多种功能强大的组件,例如资产管理器(CAssetManager)、认证管理器(CAuthManager)、请求管理器(CHttpRequest)以及日志管理器(CLogRouter)。这些组件帮助开发者更方便地管理静态资源、实现基于...
**七、路由与URL管理** Yii提供灵活的URL管理,你可以自定义URL格式。在`config/web.php`中配置URLManager,使URL更友好,例如:`/recipes/view?id=1` 可以改为 `/recipes/1`。 **八、用户交互** 添加登录注册功能...
Yii2框架提供了强大的URL管理功能,例如通过配置文件定义路由规则实现URL美化,通过RESTful API路由支持,以及自定义类处理URL操作等。对于URL管理,你还可以进行如下操作: - 使用Yii的`rules`配置来定义复杂的...
通过分析Yii2.0的运行机制,我们发现被转义的问题发生在路由的生成过程中。当使用UrlManager组件创建URL时,它默认会对URL进行编码,这是为了保证URL的有效性和安全性。然而,在某些情况下,比如在虚拟域名的配置下...
使用Gii(Yii的代码生成工具)可以快速生成这些类。 7. **URL管理** 在Yii的`config/main.php`配置文件中,定义URL规则来实现友好的URL。比如,`'urlManager' => ['rules' => [...]]`,为投票页面定义路由。 8. *...
Yii框架配置文件是整个应用的配置中枢,它负责提供应用运行时所需的各种设置,例如数据库连接参数、模块配置、路由管理等。通过对Yii配置文件的详细了解,可以更好地控制和优化应用的行为。 首先,Yii配置文件中...
具体实现时,使用了Yii的\yii\helpers\Url::toRoute方法来指定action的路由,从而获取相应的地区数据。 综上所述,Yii2实现中国省市区三级联动的实例涉及了多个方面的知识点,包括: - Yii2框架的基本配置和URL...
为了能够让Yii2处理RESTful风格的请求,必须配置URL管理规则。这涉及配置服务器的重写规则,以及在Yii2的配置文件中为控制器增加URL规则。 在Apache服务器中,通常会在frontend/web目录下新建或修改.htaccess文件,...
通过以上分析,我们可以看出,在Yii框架中正确地生成URL需要理解URL管理器的配置、URL规则以及`CHtml::link()`函数的工作原理。同时,`CUrlManager`类中的`normalizeUrl()`方法也为我们提供了更深层次的理解,帮助...