最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Zend Framework框架路由機(jī)制代碼分析

 更新時(shí)間:2016年03月22日 11:25:08   作者:yueming  
這篇文章主要介紹了Zend Framework框架路由機(jī)制,結(jié)合代碼分析了Zend Framework路由機(jī)制所涉及的控制器,路由器原理與相關(guān)代碼實(shí)現(xiàn)技巧,需要的朋友可以參考下

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

在框架中,有關(guān)路由的調(diào)用關(guān)系為:

1、apache的mod_rewrite模塊把請(qǐng)求路由到框架的啟動(dòng)腳本,一般是index.php;

2、前端控制器Zend_Controller_Front通過(guò)dispatch函數(shù)進(jìn)行請(qǐng)求分發(fā);

3、路由器Zend_Controller_Router_Rewrite通過(guò)route函數(shù)處理路由,對(duì)路由器中已有的路由規(guī)則,按照加入順序的逆序(類似于棧,后進(jìn)先出)對(duì)每個(gè)route調(diào)用match函數(shù),以檢查請(qǐng)求是否和當(dāng)前路由規(guī)則匹配,如果匹配的話把路由器的當(dāng)前路由這個(gè)變量($_currentRoute)設(shè)置為匹配的路由,并把route解析出來(lái)的參數(shù)傳給Zend_Controller_Request_Http對(duì)象,到這里完成路由設(shè)置。

如果沒(méi)有發(fā)現(xiàn)路由,框架會(huì)使用Index控制器的index這個(gè)action。

對(duì)Zend_Controller_Router_Route中的函數(shù)代碼分析:

1、構(gòu)造函數(shù)

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

2、匹配算法

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

更多關(guān)于zend相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Zend FrameWork框架入門教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《Yii框架入門及常用技巧總結(jié)》、《ThinkPHP入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家基于Zend Framework框架的PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • thinkPHP簡(jiǎn)單調(diào)用函數(shù)與類庫(kù)的方法

    thinkPHP簡(jiǎn)單調(diào)用函數(shù)與類庫(kù)的方法

    這篇文章主要介紹了thinkPHP簡(jiǎn)單調(diào)用函數(shù)與類庫(kù)的方法,簡(jiǎn)單講述了thinkPHP公共函數(shù)庫(kù)的文件位置并結(jié)合實(shí)例分析了類庫(kù)的調(diào)用方法,需要的朋友可以參考下
    2017-03-03
  • php object轉(zhuǎn)數(shù)組示例

    php object轉(zhuǎn)數(shù)組示例

    這篇文章主要介紹了php object轉(zhuǎn)數(shù)組的示例,代碼簡(jiǎn)單,可以直接看下面的代碼
    2014-01-01
  • ThinkPHP中SHOW_RUN_TIME不能正常顯示運(yùn)行時(shí)間的解決方法

    ThinkPHP中SHOW_RUN_TIME不能正常顯示運(yùn)行時(shí)間的解決方法

    這篇文章主要介紹了ThinkPHP中SHOW_RUN_TIME不能正常顯示運(yùn)行時(shí)間的解決方法,針對(duì)ThinkPHP配置文件config.php設(shè)置SHOW_RUN_TIME后不能顯示運(yùn)行時(shí)間情況下的解決方法,涉及針對(duì)ThinkPHP底層源文件的修改,需要的朋友可以參考下
    2015-10-10
  • 開(kāi)啟PHP Static 關(guān)鍵字之旅模式

    開(kāi)啟PHP Static 關(guān)鍵字之旅模式

    靜態(tài)成員是一種類變量,可以把它看成時(shí)屬于整個(gè)類而不是屬于類的某個(gè)實(shí)例。與一般的實(shí)例變量不同的是,靜態(tài)成員只保留一個(gè)變量值,而這個(gè)變量值對(duì)所有的實(shí)例都是有效的,也就是說(shuō),所有的實(shí)例共享這個(gè)成員,跟著小編一起去探討php static關(guān)鍵字吧
    2015-11-11
  • ECshop 遷移到 PHP7版本時(shí)遇到的兼容性問(wèn)題

    ECshop 遷移到 PHP7版本時(shí)遇到的兼容性問(wèn)題

    最近有網(wǎng)友問(wèn)我在php7上安裝ecshopv2.7.3時(shí),報(bào)錯(cuò),究竟了半天沒(méi)有找到原因,下面由腳本之家小編給大家分析此問(wèn)題出現(xiàn)的原因
    2016-02-02
  • 在thinkphp5.0路徑中實(shí)現(xiàn)去除index.php的方式

    在thinkphp5.0路徑中實(shí)現(xiàn)去除index.php的方式

    今天小編就為大家分享一篇在thinkphp5.0路徑中實(shí)現(xiàn)去除index.php的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • 一個(gè)模仿oso的php論壇程序源碼(之三)

    一個(gè)模仿oso的php論壇程序源碼(之三)

    一個(gè)模仿oso的php論壇程序源碼(之三)...
    2007-03-03
  • Laravel 5框架學(xué)習(xí)之表單驗(yàn)證

    Laravel 5框架學(xué)習(xí)之表單驗(yàn)證

    Laravel 通過(guò) Validation 類讓您可以簡(jiǎn)單、方便的驗(yàn)證數(shù)據(jù)正確性及查看相應(yīng)的驗(yàn)證錯(cuò)誤信息。如果是更復(fù)雜的驗(yàn)證場(chǎng)景,你可能需要?jiǎng)?chuàng)建一個(gè)"表單請(qǐng)求"。表單請(qǐng)求是一個(gè)自定義的請(qǐng)求類包含了一些驗(yàn)證的邏輯。你可以通過(guò) Artisan 的命令行 make:request 來(lái)創(chuàng)建一個(gè)表單請(qǐng)求類
    2015-04-04
  • PHP中的函數(shù)聲明與使用詳解

    PHP中的函數(shù)聲明與使用詳解

    這篇文章主要介紹了PHP中的函數(shù)聲明與使用,需要的朋友可以參考下
    2017-05-05
  • Zend Framework教程之Zend_Db_Table_Row用法實(shí)例分析

    Zend Framework教程之Zend_Db_Table_Row用法實(shí)例分析

    這篇文章主要介紹了Zend Framework教程之Zend_Db_Table_Row用法,詳細(xì)講述了Zend_Db_Table_Row的功能,并結(jié)合實(shí)例形式詳細(xì)分析了Zend_Db_Table_Row操作數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03

最新評(píng)論

攀枝花市| 清水河县| 抚远县| 留坝县| 安丘市| 会东县| 滦平县| 德化县| 峡江县| 苍山县| 庆阳市| 凯里市| 佛山市| 吴忠市| 大荔县| 长寿区| 泗阳县| 阜新市| 沙坪坝区| 额尔古纳市| 崇明县| 衡东县| 高安市| 溧水县| 庐江县| 渭源县| 六安市| 延长县| 普兰店市| 三门县| 博野县| 武胜县| 青岛市| 宜兰县| 黑山县| 三原县| 同仁县| 土默特右旗| 桐乡市| 湘阴县| 宜宾市|