洛阳铲的日志

2006年10月13日

Seagull中的makeUrl解析

Filed under: PHP,Seagull — HackGou @ 01:39

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/

Powered by WordPress