当前位置:首页 > CMS教程 > 其它CMS > 列表

Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-13 15:48:43 浏览: 评论:0 

这篇文章主要介绍了Zend Framework教程之请求对象的封装Zend_Controller_Request用法,结合实例形式详细分析了请求对象封装的原理,使用方法与相关注意事项,需要的朋友可以参考下

本文实例讲述了Zend Framework教程之请求对象的封装Zend_Controller_Request方法,分享给大家供大家参考,具体如下:

概述

请求对象是在前端控制器,路由器,分发器,以及控制类间传递的简单值对象,请求对象封装了请求的模块,控制器,动作以及可选的参数,还包括其他的请求环境,如HTTP,CLI,PHP-GTK。

请求对象的基本实现

  1. ├── Request 
  2. │   ├── Abstract.php 
  3. │   ├── Apache404.php 
  4. │   ├── Exception.php 
  5. │   ├── Http.php 
  6. │   ├── HttpTestCase.php 
  7. │   └── Simple.php 

Zend_Controller_Request_Abstract

实现了请求对象的基本方法。

  1. <?php 
  2. abstract class Zend_Controller_Request_Abstract 
  3.   protected $_dispatched = false; 
  4.   protected $_module
  5.   protected $_moduleKey = 'module'
  6.   protected $_controller
  7.   protected $_controllerKey = 'controller'
  8.   protected $_action
  9.   protected $_actionKey = 'action'
  10.   protected $_params = array(); 
  11.   public function getModuleName() 
  12.   { 
  13.     if (null === $this->_module) { 
  14.       $this->_module = $this->getParam($this->getModuleKey()); 
  15.     } 
  16.     return $this->_module; 
  17.   } 
  18.   public function setModuleName($value
  19.   { 
  20.     $this->_module = $value
  21.     return $this
  22.   } 
  23.   public function getControllerName() 
  24.   { 
  25.     if (null === $this->_controller) { 
  26.       $this->_controller = $this->getParam($this->getControllerKey()); 
  27.     } 
  28.     return $this->_controller; 
  29.   } 
  30.   public function setControllerName($value
  31.   { 
  32.     $this->_controller = $value
  33.     return $this
  34.   } 
  35.   public function getActionName() 
  36.   { 
  37.     if (null === $this->_action) { 
  38.       $this->_action = $this->getParam($this->getActionKey()); 
  39.     } 
  40.     return $this->_action; 
  41.   } 
  42.   public function setActionName($value
  43.   { 
  44.     $this->_action = $value
  45.     /** 
  46.      * @see ZF-3465 
  47.      */ 
  48.     if (null === $value) { 
  49.       $this->setParam($this->getActionKey(), $value); 
  50.     } 
  51.     return $this
  52.   } 
  53.   public function getModuleKey() 
  54.   { 
  55.     return $this->_moduleKey; 
  56.   } 
  57.   public function setModuleKey($key
  58.   { 
  59.     $this->_moduleKey = (string) $key
  60.     return $this
  61.   } 
  62.   public function getControllerKey() 
  63.   { 
  64.     return $this->_controllerKey; 
  65.   } 
  66.   public function setControllerKey($key
  67.   { 
  68.     $this->_controllerKey = (string) $key
  69.     return $this
  70.   } 
  71.   public function getActionKey() 
  72.   { 
  73.     return $this->_actionKey; 
  74.   } 
  75.   public function setActionKey($key
  76.   { 
  77.     $this->_actionKey = (string) $key
  78.     return $this
  79.   } 
  80.   public function getParam($key$default = null) 
  81.   { 
  82.     $key = (string) $key
  83.     if (isset($this->_params[$key])) { 
  84.       return $this->_params[$key]; 
  85.     } 
  86.     return $default
  87.   } 
  88.   public function getUserParams() 
  89.   { 
  90.     return $this->_params; 
  91.   } 
  92.   public function getUserParam($key$default = null) 
  93.   { 
  94.     if (isset($this->_params[$key])) { 
  95.       return $this->_params[$key]; 
  96.     } 
  97.     return $default
  98.   } 
  99.   public function setParam($key$value
  100.   { 
  101.     $key = (string) $key
  102.     if ((null === $value) && isset($this->_params[$key])) { 
  103.       unset($this->_params[$key]); 
  104.     } elseif (null !== $value) { 
  105.       $this->_params[$key] = $value
  106.     } 
  107.     return $this
  108.   } 
  109.    public function getParams() 
  110.    { 
  111.      return $this->_params; 
  112.    } 
  113.   public function setParams(array $array
  114.   { 
  115.     $this->_params = $this->_params + (array$array
  116.     foreach ($array as $key => $value) { 
  117.       if (null === $value) { 
  118.         unset($this->_params[$key]); 
  119.       } 
  120.     } 
  121.     return $this
  122.   } 
  123.   public function clearParams() 
  124.   { 
  125.     $this->_params = array(); 
  126.     return $this
  127.   } 
  128.   public function setDispatched($flag = true) 
  129.   { 
  130.     $this->_dispatched = $flag ? true : false; 
  131.     return $this
  132.   } 
  133.   public function isDispatched() 
  134.   { 
  135.     return $this->_dispatched; 
  136.   } 

Zend_Controller_Request_Http

Zend_Controller_Request请求对象的默认实现。

  1. <?php 
  2. require_once 'Zend/Controller/Request/Abstract.php'
  3. require_once 'Zend/Uri.php'
  4. class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract 
  5.   const SCHEME_HTTP = 'http'
  6.   const SCHEME_HTTPS = 'https'
  7.   protected $_paramSources = array('_GET''_POST'); 
  8.   protected $_requestUri
  9.   protected $_baseUrl = null; 
  10.   protected $_basePath = null; 
  11.   protected $_pathInfo = ''
  12.   protected $_params = array(); 
  13.   protected $_rawBody
  14.   protected $_aliases = array(); 
  15.   public function __construct($uri = null) 
  16.   { 
  17.     if (null !== $uri) { 
  18.       if (!$uri instanceof Zend_Uri) { 
  19.         $uri = Zend_Uri::factory($uri); 
  20.       } 
  21.       if ($uri->valid()) { 
  22.         $path = $uri->getPath(); 
  23.         $query = $uri->getQuery(); 
  24.         if (!emptyempty($query)) { 
  25.           $path .= '?' . $query
  26.         } 
  27.         $this->setRequestUri($path); 
  28.       } else { 
  29.         require_once 'Zend/Controller/Request/Exception.php'
  30.         throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor'); 
  31.       } 
  32.     } else { 
  33.       $this->setRequestUri(); 
  34.     } 
  35.   } 
  36.   public function __get($key
  37.   { 
  38.     switch (true) { 
  39.       case isset($this->_params[$key]): 
  40.         return $this->_params[$key]; 
  41.       case isset($_GET[$key]): 
  42.         return $_GET[$key]; 
  43.       case isset($_POST[$key]): 
  44.         return $_POST[$key]; 
  45.       case isset($_COOKIE[$key]): 
  46.         return $_COOKIE[$key]; 
  47.       case ($key == 'REQUEST_URI'): 
  48.         return $this->getRequestUri(); 
  49.       case ($key == 'PATH_INFO'): 
  50.         return $this->getPathInfo(); 
  51.       case isset($_SERVER[$key]): 
  52.         return $_SERVER[$key]; 
  53.       case isset($_ENV[$key]): 
  54.         return $_ENV[$key]; 
  55.       default
  56.         return null; 
  57.     } 
  58.   } 
  59.   public function get($key
  60.   { 
  61.     return $this->__get($key); 
  62.   } 
  63.   public function __set($key$value
  64.   { 
  65.     require_once 'Zend/Controller/Request/Exception.php'
  66.     throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()'); 
  67.   } 
  68.   public function set($key$value
  69.   { 
  70.     return $this->__set($key$value); 
  71.   } 
  72.   public function __isset($key
  73.   { 
  74.     switch (true) { 
  75.       case isset($this->_params[$key]): 
  76.         return true; 
  77.       case isset($_GET[$key]): 
  78.         return true; 
  79.       case isset($_POST[$key]): 
  80.         return true; 
  81.       case isset($_COOKIE[$key]): 
  82.         return true; 
  83.       case isset($_SERVER[$key]): 
  84.         return true; 
  85.       case isset($_ENV[$key]): 
  86.         return true; 
  87.       default
  88.         return false; 
  89.     } 
  90.   } 
  91.   public function has($key
  92.   { 
  93.     return $this->__isset($key); 
  94.   } 
  95.   public function setQuery($spec$value = null) 
  96.   { 
  97.     if ((null === $value) && !is_array($spec)) { 
  98.       require_once 'Zend/Controller/Exception.php'
  99.       throw new Zend_Controller_Exception('Invalid value passed to setQuery(); must be either array of values or key/value pair'); 
  100.     } 
  101.     if ((null === $value) && is_array($spec)) { 
  102.       foreach ($spec as $key => $value) { 
  103.         $this->setQuery($key$value); 
  104.       } 
  105.       return $this
  106.     } 
  107.     $_GET[(string) $spec] = $value
  108.     return $this
  109.   } 
  110.   public function getQuery($key = null, $default = null) 
  111.   { 
  112.     if (null === $key) { 
  113.       return $_GET
  114.     } 
  115.     return (isset($_GET[$key])) ? $_GET[$key] : $default
  116.   } 
  117.   public function setPost($spec$value = null) 
  118.   { 
  119.     if ((null === $value) && !is_array($spec)) { 
  120.       require_once 'Zend/Controller/Exception.php'
  121.       throw new Zend_Controller_Exception('Invalid value passed to setPost(); must be either array of values or key/value pair'); 
  122.     } 
  123.     if ((null === $value) && is_array($spec)) { 
  124.       foreach ($spec as $key => $value) { 
  125.         $this->setPost($key$value); 
  126.       } 
  127.       return $this
  128.     } 
  129.     $_POST[(string) $spec] = $value
  130.     return $this
  131.   } 
  132.   public function getPost($key = null, $default = null) 
  133.   { 
  134.     if (null === $key) { 
  135.       return $_POST
  136.     } 
  137.     return (isset($_POST[$key])) ? $_POST[$key] : $default
  138.   } 
  139.   public function getCookie($key = null, $default = null) 
  140.   { 
  141.     if (null === $key) { 
  142.       return $_COOKIE
  143.     } 
  144.     return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default
  145.   } 
  146.   public function getServer($key = null, $default = null) 
  147.   { 
  148.     if (null === $key) { 
  149.       return $_SERVER
  150.     } 
  151.     return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default
  152.   } 
  153.   public function getEnv($key = null, $default = null) 
  154.   { 
  155.     if (null === $key) { 
  156.       return $_ENV
  157.     } 
  158.     return (isset($_ENV[$key])) ? $_ENV[$key] : $default
  159.   } 
  160.   public function setRequestUri($requestUri = null) 
  161.   { 
  162.     if ($requestUri === null) { 
  163.       if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch 
  164.         $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; 
  165.       } elseif ( 
  166.         // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) 
  167.         isset($_SERVER['IIS_WasUrlRewritten']) 
  168.         && $_SERVER['IIS_WasUrlRewritten'] == '1' 
  169.         && isset($_SERVER['UNENCODED_URL']) 
  170.         && $_SERVER['UNENCODED_URL'] != '' 
  171.         ) { 
  172.         $requestUri = $_SERVER['UNENCODED_URL']; 
  173.       } elseif (isset($_SERVER['REQUEST_URI'])) { 
  174.         $requestUri = $_SERVER['REQUEST_URI']; 
  175.         // Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path 
  176.         $schemeAndHttpHost = $this->getScheme() . '://' . $this->getHttpHost(); 
  177.         if (strpos($requestUri$schemeAndHttpHost) === 0) { 
  178.           $requestUri = substr($requestUristrlen($schemeAndHttpHost)); 
  179.         } 
  180.       } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI 
  181.         $requestUri = $_SERVER['ORIG_PATH_INFO']; 
  182.         if (!emptyempty($_SERVER['QUERY_STRING'])) { 
  183.           $requestUri .= '?' . $_SERVER['QUERY_STRING']; 
  184.         } 
  185.       } else { 
  186.         return $this
  187.       } 
  188.     } elseif (!is_string($requestUri)) { 
  189.       return $this
  190.     } else { 
  191.       // Set GET items, if available 
  192.       if (false !== ($pos = strpos($requestUri'?'))) { 
  193.         // Get key => value pairs and set $_GET 
  194.         $query = substr($requestUri$pos + 1); 
  195.         parse_str($query$vars); 
  196.         $this->setQuery($vars); 
  197.       } 
  198.     } 
  199.     $this->_requestUri = $requestUri
  200.     return $this
  201.   } 
  202.   public function getRequestUri() 
  203.   { 
  204.     if (emptyempty($this->_requestUri)) { 
  205.       $this->setRequestUri(); 
  206.     } 
  207.     return $this->_requestUri; 
  208.   } 
  209.   public function setBaseUrl($baseUrl = null) 
  210.   { 
  211.     if ((null !== $baseUrl) && !is_string($baseUrl)) { 
  212.       return $this
  213.     } 
  214.     if ($baseUrl === null) { 
  215.       $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''
  216.       if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) { 
  217.         $baseUrl = $_SERVER['SCRIPT_NAME']; 
  218.       } elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) { 
  219.         $baseUrl = $_SERVER['PHP_SELF']; 
  220.       } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) { 
  221.         $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility 
  222.       } else { 
  223.         // Backtrack up the script_filename to find the portion matching 
  224.         // php_self 
  225.         $path  = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : ''
  226.         $file  = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : ''
  227.         $segs  = explode('/', trim($file'/')); 
  228.         $segs  = array_reverse($segs); 
  229.         $index  = 0; 
  230.         $last  = count($segs); 
  231.         $baseUrl = ''
  232.         do { 
  233.           $seg   = $segs[$index]; 
  234.           $baseUrl = '/' . $seg . $baseUrl
  235.           ++$index
  236.         } while (($last > $index) && (false !== ($pos = strpos($path$baseUrl))) && (0 != $pos)); 
  237.       } 
  238.       // Does the baseUrl have anything in common with the request_uri? 
  239.       $requestUri = $this->getRequestUri(); 
  240.       if (0 === strpos($requestUri$baseUrl)) { 
  241.         // full $baseUrl matches 
  242.         $this->_baseUrl = $baseUrl
  243.         return $this
  244.       } 
  245.       if (0 === strpos($requestUri, dirname($baseUrl))) { 
  246.         // directory portion of $baseUrl matches 
  247.         $this->_baseUrl = rtrim(dirname($baseUrl), '/'); 
  248.         return $this
  249.       } 
  250.       $truncatedRequestUri = $requestUri
  251.       if (($pos = strpos($requestUri'?')) !== false) { 
  252.         $truncatedRequestUri = substr($requestUri, 0, $pos); 
  253.       } 
  254.       $basename = basename($baseUrl); 
  255.       if (emptyempty($basename) || !strpos($truncatedRequestUri$basename)) { 
  256.         // no match whatsoever; set it blank 
  257.         $this->_baseUrl = ''
  258.         return $this
  259.       } 
  260.       // If using mod_rewrite or ISAPI_Rewrite strip the script filename 
  261.       // out of baseUrl. $pos !== 0 makes sure it is not matching a value 
  262.       // from PATH_INFO or QUERY_STRING 
  263.       if ((strlen($requestUri) >= strlen($baseUrl)) 
  264.         && ((false !== ($pos = strpos($requestUri$baseUrl))) && ($pos !== 0))) 
  265.       { 
  266.         $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); 
  267.       } 
  268.     } 
  269.     $this->_baseUrl = rtrim($baseUrl'/'); 
  270.     return $this
  271.   } 
  272.   public function getBaseUrl($raw = false) 
  273.   { 
  274.     if (null === $this->_baseUrl) { 
  275.       $this->setBaseUrl(); 
  276.     } 
  277.     return (($raw == false) ? urldecode($this->_baseUrl) : $this->_baseUrl); 
  278.   } 
  279.   public function setBasePath($basePath = null) 
  280.   { 
  281.     if ($basePath === null) { 
  282.       $filename = (isset($_SERVER['SCRIPT_FILENAME'])) 
  283.            ? basename($_SERVER['SCRIPT_FILENAME']) 
  284.            : ''
  285.       $baseUrl = $this->getBaseUrl(); 
  286.       if (emptyempty($baseUrl)) { 
  287.         $this->_basePath = ''
  288.         return $this
  289.       } 
  290.       if (basename($baseUrl) === $filename) { 
  291.         $basePath = dirname($baseUrl); 
  292.       } else { 
  293.         $basePath = $baseUrl
  294.       } 
  295.     } 
  296.     if (substr(PHP_OS, 0, 3) === 'WIN') { 
  297.       $basePath = str_replace('\\', '/', $basePath); 
  298.     } 
  299.     $this->_basePath = rtrim($basePath'/'); 
  300.     return $this
  301.   } 
  302.   public function getBasePath() 
  303.   { 
  304.     if (null === $this->_basePath) { 
  305.       $this->setBasePath(); 
  306.     } 
  307.     return $this->_basePath; 
  308.   } 
  309.   public function setPathInfo($pathInfo = null) 
  310.   { 
  311.     if ($pathInfo === null) { 
  312.       $baseUrl = $this->getBaseUrl(); // this actually calls setBaseUrl() & setRequestUri() 
  313.       $baseUrlRaw = $this->getBaseUrl(false); 
  314.       $baseUrlEncoded = urlencode($baseUrlRaw); 
  315.       if (null === ($requestUri = $this->getRequestUri())) { 
  316.         return $this
  317.       } 
  318.       // Remove the query string from REQUEST_URI 
  319.       if ($pos = strpos($requestUri'?')) { 
  320.         $requestUri = substr($requestUri, 0, $pos); 
  321.       } 
  322.       if (!emptyempty($baseUrl) || !emptyempty($baseUrlRaw)) { 
  323.         if (strpos($requestUri$baseUrl) === 0) { 
  324.           $pathInfo = substr($requestUristrlen($baseUrl)); 
  325.         } elseif (strpos($requestUri$baseUrlRaw) === 0) { 
  326.           $pathInfo = substr($requestUristrlen($baseUrlRaw)); 
  327.         } elseif (strpos($requestUri$baseUrlEncoded) === 0) { 
  328.           $pathInfo = substr($requestUristrlen($baseUrlEncoded)); 
  329.         } else { 
  330.           $pathInfo = $requestUri
  331.         } 
  332.       } else { 
  333.         $pathInfo = $requestUri
  334.       } 
  335.     } 
  336.     $this->_pathInfo = (string) $pathInfo
  337.     return $this
  338.   } 
  339.   public function getPathInfo() 
  340.   { 
  341.     if (emptyempty($this->_pathInfo)) { 
  342.       $this->setPathInfo(); 
  343.     } 
  344.     return $this->_pathInfo; 
  345.   } 
  346.   public function setParamSources(array $paramSources = array()) 
  347.   { 
  348.     $this->_paramSources = $paramSources
  349.     return $this
  350.   } 
  351.   public function getParamSources() 
  352.   { 
  353.     return $this->_paramSources; 
  354.   } 
  355.   public function setParam($key$value
  356.   { 
  357.     $key = (null !== ($alias = $this->getAlias($key))) ? $alias : $key
  358.     parent::setParam($key$value); 
  359.     return $this
  360.   } 
  361.   public function getParam($key$default = null) 
  362.   { 
  363.     $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key
  364.     $paramSources = $this->getParamSources(); 
  365.     if (isset($this->_params[$keyName])) { 
  366.       return $this->_params[$keyName]; 
  367.     } elseif (in_array('_GET'$paramSources) && (isset($_GET[$keyName]))) { 
  368.       return $_GET[$keyName]; 
  369.     } elseif (in_array('_POST'$paramSources) && (isset($_POST[$keyName]))) { 
  370.       return $_POST[$keyName]; 
  371.     } 
  372.     return $default
  373.   } 
  374.   public function getParams() 
  375.   { 
  376.     $return    = $this->_params; 
  377.     $paramSources = $this->getParamSources(); 
  378.     if (in_array('_GET'$paramSources
  379.       && isset($_GET
  380.       && is_array($_GET
  381.     ) { 
  382.       $return += $_GET
  383.     } 
  384.     if (in_array('_POST'$paramSources
  385.       && isset($_POST
  386.       && is_array($_POST
  387.     ) { 
  388.       $return += $_POST
  389.     } 
  390.     return $return
  391.   } 
  392.   public function setParams(array $params
  393.   { 
  394.     foreach ($params as $key => $value) { 
  395.       $this->setParam($key$value); 
  396.     } 
  397.     return $this
  398.   } 
  399.   public function setAlias($name$target
  400.   { 
  401.     $this->_aliases[$name] = $target
  402.     return $this
  403.   } 
  404.   public function getAlias($name
  405.   { 
  406.     if (isset($this->_aliases[$name])) { 
  407.       return $this->_aliases[$name]; 
  408.     } 
  409.     return null; 
  410.   } 
  411.   public function getAliases() 
  412.   { 
  413.     return $this->_aliases; 
  414.   } 
  415.   public function getMethod() 
  416.   { 
  417.     return $this->getServer('REQUEST_METHOD'); 
  418.   } 
  419.   public function isPost() 
  420.   { 
  421.     if ('POST' == $this->getMethod()) { 
  422.       return true; 
  423.     } 
  424.     return false; 
  425.   } 
  426.   public function isGet() 
  427.   { 
  428.     if ('GET' == $this->getMethod()) { 
  429.       return true; 
  430.     } 
  431.     return false; 
  432.   } 
  433.   public function isPut() 
  434.   { 
  435.     if ('PUT' == $this->getMethod()) { 
  436.       return true; 
  437.     } 
  438.     return false; 
  439.   } 
  440.   public function isDelete() 
  441.   { 
  442.     if ('DELETE' == $this->getMethod()) { 
  443.       return true; 
  444.     } 
  445.     return false; 
  446.   } 
  447.   public function isHead() 
  448.   { 
  449.     if ('HEAD' == $this->getMethod()) { 
  450.       return true; 
  451.     } 
  452.     return false; 
  453.   } 
  454.   public function isOptions() 
  455.   { 
  456.     if ('OPTIONS' == $this->getMethod()) { 
  457.       return true; 
  458.     } 
  459.     return false; 
  460.   } 
  461.   public function isXmlHttpRequest() 
  462.   { 
  463.     return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest'); 
  464.   } 
  465.   public function isFlashRequest() 
  466.   { 
  467.     $header = strtolower($this->getHeader('USER_AGENT')); 
  468.     return (strstr($header' flash')) ? true : false; 
  469.   } 
  470.   public function isSecure() 
  471.   { 
  472.     return ($this->getScheme() === self::SCHEME_HTTPS); 
  473.   } 
  474.   public function getRawBody() 
  475.   { 
  476.     if (null === $this->_rawBody) { 
  477.       $body = file_get_contents('php://input'); 
  478.       if (strlen(trim($body)) > 0) { 
  479.         $this->_rawBody = $body
  480.       } else { 
  481.         $this->_rawBody = false; 
  482.       } 
  483.     } 
  484.     return $this->_rawBody; 
  485.   } 
  486.   public function getHeader($header
  487.   { 
  488.     if (emptyempty($header)) { 
  489.       require_once 'Zend/Controller/Request/Exception.php'
  490.       throw new Zend_Controller_Request_Exception('An HTTP header name is required'); 
  491.     } 
  492.     // Try to get it from the $_SERVER array first 
  493.     $temp = 'HTTP_' . strtoupper(str_replace('-''_'$header)); 
  494.     if (isset($_SERVER[$temp])) { 
  495.       return $_SERVER[$temp]; 
  496.     } 
  497.     // This seems to be the only way to get the Authorization header on 
  498.     // Apache 
  499.     if (function_exists('apache_request_headers')) { 
  500.       $headers = apache_request_headers(); 
  501.       if (isset($headers[$header])) { 
  502.         return $headers[$header]; 
  503.       } 
  504.       $header = strtolower($header); 
  505.       foreach ($headers as $key => $value) { 
  506.         if (strtolower($key) == $header) { 
  507.           return $value
  508.         } 
  509.       } 
  510.     } 
  511.     return false; 
  512.   } 
  513.   public function getScheme() 
  514.   { 
  515.     return ($this->getServer('HTTPS') == 'on') ? self::SCHEME_HTTPS : self::SCHEME_HTTP; 
  516.   } 
  517.   public function getHttpHost() 
  518.   { 
  519.     $host = $this->getServer('HTTP_HOST'); 
  520.     if (!emptyempty($host)) { 
  521.       return $host
  522.     } 
  523.     $scheme = $this->getScheme(); 
  524.     $name  = $this->getServer('SERVER_NAME'); 
  525.     $port  = $this->getServer('SERVER_PORT'); 
  526.     if(null === $name) { 
  527.       return ''
  528.     } 
  529.     elseif (($scheme == self::SCHEME_HTTP && $port == 80) || ($scheme == self::SCHEME_HTTPS && $port == 443)) { 
  530.       return $name
  531.     } else { 
  532.       return $name . ':' . $port
  533.     } 
  534.   } 
  535.   public function getClientIp($checkProxy = true) 
  536.   { 
  537.     if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) { 
  538.       $ip = $this->getServer('HTTP_CLIENT_IP'); 
  539.     } else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) { 
  540.       $ip = $this->getServer('HTTP_X_FORWARDED_FOR'); 
  541.     } else { 
  542.       $ip = $this->getServer('REMOTE_ADDR'); 
  543.     } 
  544.     return $ip
  545.   } 

从上述类的实现,不难看出,类为我们提供了很多方便的方法来获取需要的数据,例如:

模块名可通过getModuleName()和setModuleName()访问。

控制器名可通过getControllerName()和setControllerName()访问。

控制器调用的动作名称可通过getActionName()和setActionName()访问。

可访问的参数是一个键值对的关联数组。数组可通过getParams()和 setParams()获取及设置,单个参数可以通过 getParam() 和 setParam()获取及设置。

基于请求的类型存在更多的可用方法。默认的Zend_Controller_Request_Http请求对象,拥有访问请求url、路径信息、$_GET 和 $_POST参数的方法等等。

请求对象先被传入到前端控制器。如果没有提供请求对象,它将在分发过程的开始、任何路由过程发生之前实例化。请求对象将被传递到分发链中的每个对象。

而且,请求对象在测试中是很有用的。开发人员可根据需要搭建请求环境,包括模块、控制器、动作、参数、URI等等,并且将其传入前端控制器来测试程序流向。如果与响应对象配合,可以对MVC程序进行精确巧妙的单元测试(unit testing)。

HTTP 请求

访问请求数据

Zend_Controller_Request_Http封装了对相关值的访问,如控制器和动作路由器变量的键名和值,从URL解析的附加参数。它还允许访问作为公共成员的超全局变量,管理当前的基地址(Base URL)和请求URI。超全局变量不能在请求对象中赋值,但可以通过setParam/getParam方法设定/获取用户参数。

Note: 超全局数据

通过Zend_Controller_Request_Http访问公共成员属性的超全局数据,有必要认识到一点,这些属性名(超全局数组的键)按照特定次序匹配超全局变量:1. GET,2.POST,3. COOKIE,4. SERVER,5. ENV。

特定的超全局变量也可以选择特定的方法来访问,如$_POST['user']可以调用请求对象的getPost('user')访问,getQuery()可以获取$_GET元素,getHeader()可以获取请求消息头。

Note: GET和POST数据

需要注意:在请求对象中访问数据是没有经过任何过滤的,路由器和分发器根据任务来验证过滤数据,但在请求对象中没有任何处理。

Note: 也获取原始 (Raw) POST 数据!

从 1.5.0 开始,也可以通过 getRawBody() 方法获取原始 post 数据。如果没有数据以那种方式提交,该方法返回 false,但 post 的全体(full boday)是个例外。

当开发一个 RESTful MVC 程序,这个对于接受内容相当有用。

可以在请求对象中使用setParam() 和getParam()来设置和获取用户参数。 路由器根据请求URI中的参数,利用这项功能请求对象设定参数。

Note: getParam()不只可以获取用户参数

getParam()事实上从几个资源中获取参数。根据优先级排序:通过setParam()设置的用户参数,GET 参数,最后是POST参数。 通过该方法获取数据时需要注意这点。

如果你希望从你通过 setParam() 设置的参数中获取(参数),使用 getUserParam()。

另外,从 1.5.0 开始,可以锁定搜索哪个参数源,setParamSources() 允许指定一个空数组或者一个带有一个或多个指示哪个参数源被允许(缺省两者都被允许)的值 '_GET'或'_POST'的数组;如果想限制只访问 '_GET',那么指定 setParamSources(array('_GET')) 。

Note: Apache相关

如果使用apache的404处理器来传递请求到前端控制器,或者使用重写规则(rewrite rules)的PT标志,URI包含在$_SERVER['REDIRECT_URL'],而不是$_SERVER['REQUEST_URI']。如果使用这样的设定并获取无效的路由,应该使用Zend_Controller_Request_Apache404类代替默认的HTTP类:

$request = new Zend_Controller_Request_Apache404();

$front->setRequest($request);

这个类继承了Zend_Controller_Request_Http,并简单的修改了请求URI的自动发现(autodiscovery),它可以用来作为简易替换器件(drop-in replacement)。

基地址和子目录

Zend_Controller_Request_Http允许在子目录中使用Zend_Controller_Router_Rewrite。Zend_Controller_Request_Http试图自动的检测你的基地址,并进行相应的设置。

例如,如果将 index.php 放在web服务器的名为/projects/myapp/index.php子目录中,基地址应该被设置为/projects/myapp。计算任何路由匹配之前将先从路径中去除这个字符串。这个字串需要被加入到任何路由前面。路由 'user/:username'将匹配类似http://localhost/projects/myapp/user/martel 和http://example.com/user/martel的URL。

Note: URL检测区分大小写

基地址的自动检测是区分大小写的,因此需要确保URL与文件系统中的子目录匹配。否则将会引发异常。

如果基地址经检测不正确,可以利用Zend_Controller_Request_Http或者Zend_Controller_Front类的setBaseUrl()方法设置自己的基路径。Zend_Controller_Front设置最容易,它将导入基地址到请求对象。定制基地址的用法举例:

  1. /** 
  2.  * Dispatch Request with custom base URL with Zend_Controller_Front. 
  3.  */ 
  4. $router   = new Zend_Controller_Router_Rewrite(); 
  5. $controller = Zend_Controller_Front::getInstance(); 
  6. $controller->setControllerDirectory('./application/controllers'
  7.       ->setRouter($router
  8.       ->setBaseUrl('/projects/myapp'); // set the base url! 
  9. $response  = $controller->dispatch(); 

判断请求方式

getMethod() 允许你决定用于请求当前资源的 HTTP 请求方法。另外,当询问是否一个请求的特定类型是否已经存在,有许多方法允许你获得布尔响应:

  1. isGet() 
  2. isPost() 
  3. isPut() 
  4. isDelete() 
  5. isHead() 
  6. isOptions() 

这些基本用例是来创建 RESTful MVC 架构的。

AJAX 请求

Zend_Controller_Request_Http 有一个初步的方法用来检测AJAX请求:isXmlHttpRequest()。这个方法寻找一个带有'XMLHttpRequest' 值的HTTP请求头X-Requested-With;如果发现,就返回true。

当前,这个头用下列JS库缺省地传递:

  1. Prototype/Scriptaculous (and libraries derived from Prototype) 
  2. Yahoo! UI Library 
  3. jQuery 
  4. MochiKit 

大多数 AJAX 库允许发送定制的HTTP请求头;如果你的库没有发送这个头,简单地把它作为一个请求头添加上确保isXmlHttpRequest() 方法工作。

子类化请求对象。

请求对象是请求环境的容器,控制器链实际上只需要知道如何设置和获取控制器、动作,可选的参数以及分发的状态,默认的,请求将使用controller和action键查询自己的参数来确定控制器和动作。

需要一个请求类来与特定的环境交互以获得需要的数据时,可以扩展该基类或它的衍生类,例如HTTP环境,CLI环境,或者PHP-GTK环境。

Tags: Framework Zend_Controller_Request

分享到: