Seagull中的makeUrl解析
makeUrl原型位于Output:
- makeUrl($action = '', $mgr = '', $mod = '', $aList = array(), $params = '', $idx = 0)
makeUrl由Output调用别名函数
- SGL_Url::makeLink SGL_Url::makeLink($action, $mgr, $mod, $aList, $params, $idx, $this)
实现.
而SGL_Url::makeLink则是从$conf['site']['outputUrlHandler']的实例中调用
makeLink(tion, $mgr, $mod, $aList, $params, $idx, $output)完成真正的url生成。
默认情况下$conf['site']['outputUrlHandler']的值为SGL_UrlParser_SefStrategy。
它是从SGL_UrlParserStrategy中继承而来。解析makeLink即可解释默认的makeUrl所发生的动作,
当然也可以自己继承SGL_UrlParserStrategy,来实现自己独特风格的makeUrl函数。
makeLink($action, $mgr, $mod, $aList, $params, $idx) $action、$action, $mgr, $mod,从名字就可以看出来。 关键是后面$aList, $params, $idx三个参数。 makeLinnk首先将$params中的参数使用’||’拆分成’参数名|值’对的形式,比如#image_id|imageId||a|2||b|[a,1,2,3-4,,4] 将拆分成 image_id|iamgeId和 a|2和 b|[1,2,3-4,4] 两个’参数名|值’对。
然后分别将这些值对使用’|'拆成$qsParamName和$listKey循环带入$aList的每个元素进行如下检查:
- if ($aList不为空且$aList最后一个单元为数组
- 或者$aList是数组且最后一个单元为对象
- 或者$aList单元数目不为零。
- 或者$aList等于0 )
- { if( $aList[$idx][$listKey]存在且$listKey不为空){
- $qsParamValue = $aList[$idx][$listKey]
- }elseif( $aList[$idx]存在且$listKey为空 ) {
- $qsParamValue = $idx;
- }else{
- if($listKey包含'[') {
- #$listKey为hash
- $aElems = array_filter(preg_split('/[^a-z_0-9]/i', $listKey), 'strlen');
- #用非数字字母和下划线拆分不含空元素的数组
- if (!($aList) && is_a($output, 'SGL_Output')) {
- #如果$aList空且$output为SGL_Output的实例
- // variable is of type $output->org['organisation_id'] = 'foo';
- $qsParamValue = $output>{$aElems[0]}[$aElems[1]];
- //$qsParamValue = $output->a[1] ;
- } else {
- $qsParamValue = $aList[$idx][$aElems[0]][$aElems[1]];
- //$qsParamValue = $aList[$idx][a][1] ;
- }
- }elseif( is_a($output, 'SGL_Output') &&
- !empty($listKey) &&
- isset($output->{$listKey})){
- $qsParamValue = $output->{$listKey}
- # 此例中$qsParamName为image_id时 $qsParamValue = $output->imageId
- }else{
- $qsParamValue = $listKey # 否则直接 a = 2
- }
- }
- }else{
- $qs .= '/' . $qsParamName . '/' . $aList[$idx]->$listKey;
- }
由此可以看出$aList,$idx和不同格式的$params可以变化出非常多的参数取值,
下面是 $params = qsParamName|imageId||qsParamName||2||qsParamName|[a,1,2,3-4,,4] 时,一些有可能的结果,
这些结果很大程度上取决于$aList,$idx和两个参数的取值:
- $qsParamName = $aList[$idx][$imageId];
- $qsParamName = $idx;
- $qsParamName = $output->a[1];
- $qsParamName = $aList[$idx][a][1];
- $qsParamName = $output->imageId;
- $qsParamName = 2;
这其实是一个取值链,举个例子:
- {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2#)}
- ?>
的结果为:
- /favorite/action/add/image_id/60/a/2/
- {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|[imageName,1,2,3-4,,4]#,)}
- ?>
的结果为:
- /favorite/action/add/image_id/60/a/2/qsParamName/$output->imageName[1]
的结果为:
- makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|imageName#)
- ?>
的结果为:
- /favorite/action/add/image_id/60/a/2/qsParamName/60.jpg/

香帅 Said on October 13th, 2006 at 07:42 quote
Seagull 要是有个简单的中文使用教程那有多好哇