欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

2、前端控制器Zend_Controller_Front通過dispatch函數(shù)進行請求分發(fā);

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

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

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

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

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

2、匹配算法

public function match($path)
{
  $pathStaticCount = 0;
  $defaults = $this->_defaults; //默認值數(shù)組,數(shù)組元素的鍵值是變量名
   //默認值數(shù)組的一個拷貝,不過變量的值全部換成布爾值,其實這個值并沒有實際用處,下面程序僅僅
  //是通過判斷鍵值是否存在而確定是否包含一個變量,可能這么做是為了節(jié)省空間,不過要是這樣的話
  //不如直接使用 $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ī)則的對應部分比較,如果path中存在,
     //而規(guī)則中不存在對應部分,那么該規(guī)則肯定不匹配,這里要注意$pos,是通過它把規(guī)則
     //和path的對應部分對應起來。
     return false;
    }
    if ($this->_parts[$pos]['regex'] == '*') {
      //如果規(guī)則的當前部分是通配符*,則把path的剩余部分解釋為url傳遞過來的變量,他們按照
     //“變量名/變量值”這樣的形式成對出現(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);//對傳過來的值進行解碼
    if ($name === null) {//普通字符串,和規(guī)則的對應部分比較是否相等即可
     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 {
     //把普通字符串的匹配計數(shù)加1,因為規(guī)則中的普通字符串是必須在path中存在的,否則就是
     //匹配失敗
     $pathStaticCount++;
    }
   }
  }
   //$this->_values中保存的是分析獲取的變量,如果規(guī)則中存在‘*',則$this->_params是獲取的
  //變量,否則是空數(shù)組,$this->_defaults是規(guī)則提供的默認變量值,這里用‘+'把三個數(shù)組相加
  //這樣的好處是如果后面的數(shù)組與前面的數(shù)組有相同的非整數(shù)的鍵值,后面的不會覆蓋前面的,這
  //與array_merge函數(shù)有區(qū)別,后者是會覆蓋的。也就是說,如果$this->_values 中已經(jīng)有鍵controller
  //,那么$this->_defaults中的controller元素就被忽略,這樣就$this->_defaults中的默認值只有在path
  //中不存在的時候才會出現(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;
}

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

希望本文所述對大家基于Zend Framework框架的PHP程序設計有所幫助。

相關文章

  • PHP如何解決微信文章圖片防盜鏈

    PHP如何解決微信文章圖片防盜鏈

    這篇文章主要介紹了PHP如何解決微信文章圖片防盜鏈,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • php使用event擴展的io復用測試的示例

    php使用event擴展的io復用測試的示例

    這篇文章主要介紹了php使用event擴展的io復用測試的示例,幫助大家更好的理解和使用php,感興趣的朋友可以了解下
    2020-10-10
  • PHP仿博客園 個人博客(1) 數(shù)據(jù)庫與界面設計

    PHP仿博客園 個人博客(1) 數(shù)據(jù)庫與界面設計

    自學PHP大半年多了,斷斷續(xù)續(xù)地,但是最終還是堅定了我的想法,將PHP繼續(xù)下去,所以寫這個PHP的博客是為了找個穩(wěn)定的 PHP工作,不求工資多高,但求一收留之地
    2013-07-07
  • PHP實現(xiàn)遠程下載文件到本地

    PHP實現(xiàn)遠程下載文件到本地

    經(jīng)常寫采集器發(fā)布接口需要使用到遠程附件的功能,所以自己寫了一個PHP遠程下載文件到本地的函數(shù),一般情況下已經(jīng)夠用了,如果服務器支持CURL函數(shù),程序則會優(yōu)先選擇CURL,有需要的小伙伴可以參考下。
    2015-05-05
  • 用 Composer構(gòu)建自己的 PHP 框架之設計 MVC

    用 Composer構(gòu)建自己的 PHP 框架之設計 MVC

    幾乎所有人都是通過學習某個框架來了解 MVC 的,這樣可能框架用的很熟,一旦離了框架一個簡單的頁面都寫不了,更不要說自己設計 MVC 架構(gòu)了,其實這里面也沒有那么多門道,原理非常清晰
    2014-10-10
  • php格式化日期和時間格式化示例分享

    php格式化日期和時間格式化示例分享

    這篇文章主要介紹了php格式化日期示例,需要的朋友可以參考下
    2014-02-02
  • WordPress中設置Post Type自定義文章類型的實例教程

    WordPress中設置Post Type自定義文章類型的實例教程

    這篇文章主要介紹了WordPress中設置Post Type自定義文章類型的實例教程,后臺文章類型的設置是WordPress的一大特色,然而自帶的文章類型往往并不夠用,需要的朋友可以參考下
    2016-05-05
  • php堆排序(heapsort)練習

    php堆排序(heapsort)練習

    本文內(nèi)容是和大家一起練習PHP堆排序的一個程序
    2013-11-11
  • Yii框架Session與Cookie使用方法示例

    Yii框架Session與Cookie使用方法示例

    這篇文章主要介紹了Yii框架Session與Cookie使用方法,結(jié)合實例形式分析了Yii框架針對Session與Cookie的設置、獲取、刪除等相關操作技巧,需要的朋友可以參考下
    2019-10-10
  • php解析非標準json、非規(guī)范json的方式實例

    php解析非標準json、非規(guī)范json的方式實例

    這篇文章主要給大家介紹了關于利用php解析非標準json、非規(guī)范json的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論