Seagull中的makeUrl解析

makeUrl原型位于Output:

  1. makeUrl($action = '', $mgr = '', $mod = '', $aList = array(), $params = '', $idx = 0)

makeUrl由Output调用别名函数

  1. 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的每个元素进行如下检查:

  1. if ($aList不为空且$aList最后一个单元为数组
  2.     或者$aList是数组且最后一个单元为对象
  3.     或者$aList单元数目不为零。
  4.     或者$aList等于0 )
  5.     { if( $aList[$idx][$listKey]存在且$listKey不为空){
  6.              $qsParamValue = $aList[$idx][$listKey]
  7.     }elseif( $aList[$idx]存在且$listKey为空 ) { 
  8.              $qsParamValue = $idx;
  9.     }else{
  10.              if($listKey包含'[') {
  11.                     #$listKey为hash 
  12.                     $aElems = array_filter(preg_split('/[^a-z_0-9]/i', $listKey), 'strlen')
  13.                     #用非数字字母和下划线拆分不含空元素的数组 
  14.                     if (!($aList) && is_a($output, 'SGL_Output')) { 
  15.                         #如果$aList空且$output为SGL_Output的实例 
  16.                         // variable is of type  $output->org['organisation_id'] = 'foo'; 
  17.                         $qsParamValue = $output>{$aElems[0]}[$aElems[1]]
  18.                         //$qsParamValue = $output->a[1] ; 
  19.                     } else { 
  20.                         $qsParamValue = $aList[$idx][$aElems[0]][$aElems[1]]
  21.                         //$qsParamValue = $aList[$idx][a][1] ; 
  22.                     } 
  23.                 }elseif( is_a($output, 'SGL_Output') && 
  24.                             !empty($listKey) && 
  25.                             isset($output->{$listKey})){ 
  26.                     $qsParamValue = $output->{$listKey}
  27.                      # 此例中$qsParamName为image_id时 $qsParamValue = $output->imageId 
  28.                 }else{ 
  29.                     $qsParamValue = $listKey # 否则直接 a = 2 
  30.                 }
  31.          }
  32. }else{ 
  33.     $qs .= '/' . $qsParamName . '/' . $aList[$idx]->$listKey;
  34. }

由此可以看出$aList,$idx和不同格式的$params可以变化出非常多的参数取值,
下面是 $params = qsParamName|imageId||qsParamName||2||qsParamName|[a,1,2,3-4,,4] 时,一些有可能的结果,
这些结果很大程度上取决于$aList,$idx和两个参数的取值:

  1. $qsParamName = $aList[$idx][$imageId];
  2. $qsParamName = $idx;
  3. $qsParamName = $output->a[1];
  4. $qsParamName = $aList[$idx][a][1];
  5. $qsParamName = $output->imageId;
  6. $qsParamName = 2;

这其实是一个取值链,举个例子:

  1. {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2#)}
  2. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/
  2. {makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|[imageName,1,2,3-4,,4]#,)}
  3. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/qsParamName/$output->imageName[1]

的结果为:

  1. makeUrl(#add#,#favorite#,#favorite#,##,#image_id|imageId||a|2||qsParamName|imageName#)
  2. ?>

的结果为:

  1. /favorite/action/add/image_id/60/a/2/qsParamName/60.jpg/

One Response to “Seagull中的makeUrl解析”

  1. Seagull 要是有个简单的中文使用教程那有多好哇

Leave a Reply




=>


Creative Commons License
This work is licensed under a Creative Commons License.