亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Zend Framework框架路由機制代碼分析

2024-05-04 23:44:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Zend Framework框架路由機制,結合代碼分析了Zend Framework路由機制所涉及的控制器,路由器原理與相關代碼實現技巧,需要的朋友可以參考下
 

本文分析了Zend Framework框架路由機制代碼。分享給大家供大家參考,具體如下:

在框架中,有關路由的調用關系為:

1、apache的mod_rewrite模塊把請求路由到框架的啟動腳本,一般是index.php;

2、前端控制器Zend_Controller_Front通過dispatch函數進行請求分發;

3、路由器Zend_Controller_Router_Rewrite通過route函數處理路由,對路由器中已有的路由規則,按照加入順序的逆序(類似于棧,后進先出)對每個route調用match函數,以檢查請求是否和當前路由規則匹配,如果匹配的話把路由器的當前路由這個變量($_currentRoute)設置為匹配的路由,并把route解析出來的參數傳給Zend_Controller_Request_Http對象,到這里完成路由設置。

如果沒有發現路由,框架會使用Index控制器的index這個action。

對Zend_Controller_Router_Route中的函數代碼分析:

1、構造函數

public function __construct($route, $defaults = array(), $reqs = array()){  $route = trim($route, $this->_urlDelimiter); //去掉規則首尾的url分隔符(默認是/)  $this->_defaults = (array) $defaults; //默認值數組,以變量名為鍵  $this->_requirements = (array) $reqs; //變量需要滿足的正則表達式,以變量名為鍵  if ($route != '') {   foreach (explode($this->_urlDelimiter, $route) as $pos => $part) {    //把規則切分為一個數組    if (substr($part, 0, 1) == $this->_urlVariable) {//如果是一個變量的定義     $name = substr($part, 1); //獲取變量名     //如果該變量定義了對應的正則表達式,則獲取該表達式,否則置為null     $regex = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex);     //_parts數組包含了規則的各個部分,如果是變量的話,數組中有name元素     $this->_parts[$pos] = array('name' => $name, 'regex' => $regex);     //_vars包含了該規則中的所有變量的名字     $this->_vars[] = $name;    } else { //普通字符串     $this->_parts[$pos] = array('regex' => $part);     if ($part != '*') {      $this->_staticCount++; //該規則的普通字符串的個數     }    }   }  }}

2、匹配算法

public function match($path){  $pathStaticCount = 0;  $defaults = $this->_defaults; //默認值數組,數組元素的鍵值是變量名   //默認值數組的一個拷貝,不過變量的值全部換成布爾值,其實這個值并沒有實際用處,下面程序僅僅  //是通過判斷鍵值是否存在而確定是否包含一個變量,可能這么做是為了節省空間,不過要是這樣的話  //不如直接使用 $this->_defaults了?  if (count($defaults)) {   $unique = array_combine(array_keys($defaults), array_fill(0, count($defaults), true));  } else {   $unique = array();  }  $path = trim($path, $this->_urlDelimiter); //傳入的path是已經去掉baseUrl的,這里確保去掉首尾的分隔符  if ($path != '') {   $path = explode($this->_urlDelimiter, $path);   foreach ($path as $pos => $pathPart) {    if (!isset($this->_parts[$pos])) {     //把path根據url分隔符分割為數組后,把每一部分和規則的對應部分比較,如果path中存在,     //而規則中不存在對應部分,那么該規則肯定不匹配,這里要注意$pos,是通過它把規則     //和path的對應部分對應起來。     return false;    }    if ($this->_parts[$pos]['regex'] == '*') {      //如果規則的當前部分是通配符*,則把path的剩余部分解釋為url傳遞過來的變量,他們按照     //“變量名/變量值”這樣的形式成對出現     $parts = array_slice($path, $pos); //獲取path的剩余部分     $this->_getWildcardData($parts, $unique);     break;    }    $part = $this->_parts[$pos];    $name = isset($part['name']) ? $part['name'] : null;    $pathPart = urldecode($pathPart);//對傳過來的值進行解碼    if ($name === null) {//普通字符串,和規則的對應部分比較是否相等即可     if ($part['regex'] != $pathPart) {      return false;     }    } elseif ($part['regex'] === null) {      //如果是變量,但是沒有需要滿足的正則表達式,那么只有值不為空就可以了     if (strlen($pathPart) == 0) {      return false;     }    } else {//如果對該變量需要滿足一個正則表達式,那么這里進行驗證     $regex = $this->_regexDelimiter . '^' . $part['regex'] . '$' . $this->_regexDelimiter . 'iu';     if (!preg_match($regex, $pathPart)) {      return false;     }    }    if ($name !== null) {     // 如果是一個變量,則設置變量的值     $this->_values[$name] = $pathPart;     $unique[$name] = true; //其實沒有必要設置,這個版本根本就沒有用它    } else {     //把普通字符串的匹配計數加1,因為規則中的普通字符串是必須在path中存在的,否則就是     //匹配失敗     $pathStaticCount++;    }   }  }   //$this->_values中保存的是分析獲取的變量,如果規則中存在‘*',則$this->_params是獲取的  //變量,否則是空數組,$this->_defaults是規則提供的默認變量值,這里用‘+'把三個數組相加  //這樣的好處是如果后面的數組與前面的數組有相同的非整數的鍵值,后面的不會覆蓋前面的,這  //與array_merge函數有區別,后者是會覆蓋的。也就是說,如果$this->_values 中已經有鍵controller  //,那么$this->_defaults中的controller元素就被忽略,這樣就$this->_defaults中的默認值只有在path  //中不存在的時候才會出現在返回值中。  $return = $this->_values + $this->_params + $this->_defaults;  // Check if all static mappings have been met  if ($this->_staticCount != $pathStaticCount) {//規則的所有普通字符串必須在path中得到匹配   return false;  }  // 解析完后,規則定義的所有變量也必須全部出現,否則視為不匹配  foreach ($this->_vars as $var) {   if (!array_key_exists($var, $return)) {    return false;   }  }  return $return;}
 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看国产精品91| 亚洲欧美国产视频| 亚洲激情成人网| 91美女福利视频高清| 日韩成人在线视频| 精品久久久91| 欧美日韩亚洲激情| 亚洲天堂av综合网| 在线免费观看羞羞视频一区二区| 亚洲人成在线一二| 97视频在线看| 成人在线视频网站| 亚洲天堂网在线观看| 久久中国妇女中文字幕| 欧美色xxxx| 欧美日韩福利在线观看| 亚洲综合色激情五月| 不卡av电影在线观看| 国产精品99久久99久久久二8| 91精品91久久久久久| 日韩免费观看在线观看| 97国产真实伦对白精彩视频8| 欧美视频在线免费| 92国产精品久久久久首页| 亚洲一区二区久久久| 亚洲大胆人体在线| 欧美日韩激情视频8区| 97成人超碰免| 美女久久久久久久| 国产精品美乳在线观看| 久久久999精品免费| 国产精品一久久香蕉国产线看观看| 欧美激情高清视频| 九九九热精品免费视频观看网站| 欧美激情中文字幕乱码免费| 午夜免费久久久久| 国产精品久久久久影院日本| 久久久久久国产| 国产亚洲精品综合一区91| 欧美精品激情在线| 78色国产精品| 国产精品尤物福利片在线观看| 国产欧美一区二区三区在线| 欧美激情va永久在线播放| 国产91露脸中文字幕在线| 欧美午夜视频一区二区| 亚洲人成在线电影| 日韩午夜在线视频| 亚洲丝袜在线视频| 欧美床上激情在线观看| 亚洲欧美综合精品久久成人| 精品调教chinesegay| 国产亚洲成精品久久| 尤物yw午夜国产精品视频明星| 2019中文字幕在线| 欧美亚洲国产成人精品| 欧美亚洲视频一区二区| 超碰日本道色综合久久综合| 国产亚洲一区二区精品| 久久99国产精品久久久久久久久| 国产九九精品视频| 欧美成人在线免费| 青青草国产精品一区二区| 亚洲男人天堂2019| 国产美女扒开尿口久久久| 欧美一级bbbbb性bbbb喷潮片| 丰满岳妇乱一区二区三区| 欧美性高跟鞋xxxxhd| 亚洲第一网中文字幕| 欧美xxxx做受欧美| 久久夜精品香蕉| 国产精品久久久久久久美男| 久久大大胆人体| 亚洲精品美女免费| 国产视频999| 超在线视频97| 国内精品中文字幕| 性色av一区二区三区免费| 国产亚洲激情视频在线| 精品国产一区二区在线| 91麻豆国产语对白在线观看| 8x拔播拔播x8国产精品| 国产精品久久久久影院日本| 啪一啪鲁一鲁2019在线视频| 亚洲四色影视在线观看| 欧美高清理论片| 亚洲第一页在线| 国产一区二区三区在线看| 欧美肥老太性生活视频| 国产日韩一区在线| 久久久精品国产| 久久夜色撩人精品| 欧美一区二区三区图| 欧美高清视频在线| 欧美日韩在线第一页| 亲爱的老师9免费观看全集电视剧| 97视频在线观看视频免费视频| 一本色道久久88综合亚洲精品ⅰ| 国产精品青青在线观看爽香蕉| 北条麻妃久久精品| 美女福利视频一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品综合久久久久久97| 欧美成人小视频| 亚洲欧洲一区二区三区久久| 尤物精品国产第一福利三区| 亚洲综合在线小说| 中文日韩电影网站| 亚洲色图偷窥自拍| 亚洲肉体裸体xxxx137| 亚洲国产精品视频在线观看| 亚洲最新视频在线| 亚洲电影免费观看高清| 色av中文字幕一区| 国产精品成人国产乱一区| 久久免费国产视频| 亚洲男女自偷自拍图片另类| 91av免费观看91av精品在线| 国产亚洲日本欧美韩国| 中文字幕久热精品在线视频| 精品一区二区亚洲| 亚洲国产精品va在线观看黑人| 久久久亚洲国产天美传媒修理工| 国产精品av在线播放| 性色av一区二区三区免费| 国产91露脸中文字幕在线| 91在线观看免费观看| 国外日韩电影在线观看| 中文综合在线观看| 91热精品视频| 一区二区三区亚洲| 国产精品三级在线| 久久精品99无色码中文字幕| 日日噜噜噜夜夜爽亚洲精品| 亚洲91精品在线| 欧美丰满片xxx777| 成人精品一区二区三区| 91精品国产91久久久久久不卡| 国产精品久久久久一区二区| 中文字幕亚洲情99在线| 92国产精品视频| 中文字幕在线精品| 久久影院模特热| 操91在线视频| 日韩精品免费在线播放| 97成人精品区在线播放| 日韩动漫免费观看电视剧高清| 最好看的2019的中文字幕视频| 久久久精品2019中文字幕神马| 国产精品三级在线| 中文字幕精品久久| 丝袜情趣国产精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩美女av在线| 亚洲一区二区三区成人在线视频精品| 欧美精品久久久久| 亚洲天堂av电影| 国产成人精品av在线| 国产精品美女久久久免费| 亚洲精品自拍视频| 亚洲mm色国产网站| 日本道色综合久久影院| 中文字幕在线亚洲| 日韩中文字幕视频在线|