Zend Framework教程之請(qǐng)求對(duì)象的封裝Zend_Controller_Request實(shí)例詳解
本文實(shí)例講述了Zend Framework教程之請(qǐng)求對(duì)象的封裝Zend_Controller_Request方法。分享給大家供大家參考,具體如下:
概述
請(qǐng)求對(duì)象是在前端控制器,路由器,分發(fā)器,以及控制類(lèi)間傳遞的簡(jiǎn)單值對(duì)象。請(qǐng)求對(duì)象封裝了請(qǐng)求的模塊,控制器,動(dòng)作以及可選的參數(shù),還包括其他的請(qǐng)求環(huán)境,如HTTP,CLI,PHP-GTK。
請(qǐng)求對(duì)象的基本實(shí)現(xiàn)
├── Request
│ ├── Abstract.php
│ ├── Apache404.php
│ ├── Exception.php
│ ├── Http.php
│ ├── HttpTestCase.php
│ └── Simple.php
Zend_Controller_Request_Abstract
實(shí)現(xiàn)了請(qǐng)求對(duì)象的基本方法。
<?php abstract class Zend_Controller_Request_Abstract { protected $_dispatched = false; protected $_module; protected $_moduleKey = 'module'; protected $_controller; protected $_controllerKey = 'controller'; protected $_action; protected $_actionKey = 'action'; protected $_params = array(); public function getModuleName() { if (null === $this->_module) { $this->_module = $this->getParam($this->getModuleKey()); } return $this->_module; } public function setModuleName($value) { $this->_module = $value; return $this; } public function getControllerName() { if (null === $this->_controller) { $this->_controller = $this->getParam($this->getControllerKey()); } return $this->_controller; } public function setControllerName($value) { $this->_controller = $value; return $this; } public function getActionName() { if (null === $this->_action) { $this->_action = $this->getParam($this->getActionKey()); } return $this->_action; } public function setActionName($value) { $this->_action = $value; /** * @see ZF-3465 */ if (null === $value) { $this->setParam($this->getActionKey(), $value); } return $this; } public function getModuleKey() { return $this->_moduleKey; } public function setModuleKey($key) { $this->_moduleKey = (string) $key; return $this; } public function getControllerKey() { return $this->_controllerKey; } public function setControllerKey($key) { $this->_controllerKey = (string) $key; return $this; } public function getActionKey() { return $this->_actionKey; } public function setActionKey($key) { $this->_actionKey = (string) $key; return $this; } public function getParam($key, $default = null) { $key = (string) $key; if (isset($this->_params[$key])) { return $this->_params[$key]; } return $default; } public function getUserParams() { return $this->_params; } public function getUserParam($key, $default = null) { if (isset($this->_params[$key])) { return $this->_params[$key]; } return $default; } public function setParam($key, $value) { $key = (string) $key; if ((null === $value) && isset($this->_params[$key])) { unset($this->_params[$key]); } elseif (null !== $value) { $this->_params[$key] = $value; } return $this; } public function getParams() { return $this->_params; } public function setParams(array $array) { $this->_params = $this->_params + (array) $array; foreach ($array as $key => $value) { if (null === $value) { unset($this->_params[$key]); } } return $this; } public function clearParams() { $this->_params = array(); return $this; } public function setDispatched($flag = true) { $this->_dispatched = $flag ? true : false; return $this; } public function isDispatched() { return $this->_dispatched; } }
Zend_Controller_Request_Http
Zend_Controller_Request請(qǐng)求對(duì)象的默認(rèn)實(shí)現(xiàn)。
<?php require_once 'Zend/Controller/Request/Abstract.php'; require_once 'Zend/Uri.php'; class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract { const SCHEME_HTTP = 'http'; const SCHEME_HTTPS = 'https'; protected $_paramSources = array('_GET', '_POST'); protected $_requestUri; protected $_baseUrl = null; protected $_basePath = null; protected $_pathInfo = ''; protected $_params = array(); protected $_rawBody; protected $_aliases = array(); public function __construct($uri = null) { if (null !== $uri) { if (!$uri instanceof Zend_Uri) { $uri = Zend_Uri::factory($uri); } if ($uri->valid()) { $path = $uri->getPath(); $query = $uri->getQuery(); if (!empty($query)) { $path .= '?' . $query; } $this->setRequestUri($path); } else { require_once 'Zend/Controller/Request/Exception.php'; throw new Zend_Controller_Request_Exception('Invalid URI provided to constructor'); } } else { $this->setRequestUri(); } } public function __get($key) { switch (true) { case isset($this->_params[$key]): return $this->_params[$key]; case isset($_GET[$key]): return $_GET[$key]; case isset($_POST[$key]): return $_POST[$key]; case isset($_COOKIE[$key]): return $_COOKIE[$key]; case ($key == 'REQUEST_URI'): return $this->getRequestUri(); case ($key == 'PATH_INFO'): return $this->getPathInfo(); case isset($_SERVER[$key]): return $_SERVER[$key]; case isset($_ENV[$key]): return $_ENV[$key]; default: return null; } } public function get($key) { return $this->__get($key); } public function __set($key, $value) { require_once 'Zend/Controller/Request/Exception.php'; throw new Zend_Controller_Request_Exception('Setting values in superglobals not allowed; please use setParam()'); } public function set($key, $value) { return $this->__set($key, $value); } public function __isset($key) { switch (true) { case isset($this->_params[$key]): return true; case isset($_GET[$key]): return true; case isset($_POST[$key]): return true; case isset($_COOKIE[$key]): return true; case isset($_SERVER[$key]): return true; case isset($_ENV[$key]): return true; default: return false; } } public function has($key) { return $this->__isset($key); } public function setQuery($spec, $value = null) { if ((null === $value) && !is_array($spec)) { require_once 'Zend/Controller/Exception.php'; throw new Zend_Controller_Exception('Invalid value passed to setQuery(); must be either array of values or key/value pair'); } if ((null === $value) && is_array($spec)) { foreach ($spec as $key => $value) { $this->setQuery($key, $value); } return $this; } $_GET[(string) $spec] = $value; return $this; } public function getQuery($key = null, $default = null) { if (null === $key) { return $_GET; } return (isset($_GET[$key])) ? $_GET[$key] : $default; } public function setPost($spec, $value = null) { if ((null === $value) && !is_array($spec)) { require_once 'Zend/Controller/Exception.php'; throw new Zend_Controller_Exception('Invalid value passed to setPost(); must be either array of values or key/value pair'); } if ((null === $value) && is_array($spec)) { foreach ($spec as $key => $value) { $this->setPost($key, $value); } return $this; } $_POST[(string) $spec] = $value; return $this; } public function getPost($key = null, $default = null) { if (null === $key) { return $_POST; } return (isset($_POST[$key])) ? $_POST[$key] : $default; } public function getCookie($key = null, $default = null) { if (null === $key) { return $_COOKIE; } return (isset($_COOKIE[$key])) ? $_COOKIE[$key] : $default; } public function getServer($key = null, $default = null) { if (null === $key) { return $_SERVER; } return (isset($_SERVER[$key])) ? $_SERVER[$key] : $default; } public function getEnv($key = null, $default = null) { if (null === $key) { return $_ENV; } return (isset($_ENV[$key])) ? $_ENV[$key] : $default; } public function setRequestUri($requestUri = null) { if ($requestUri === null) { if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; } elseif ( // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) isset($_SERVER['IIS_WasUrlRewritten']) && $_SERVER['IIS_WasUrlRewritten'] == '1' && isset($_SERVER['UNENCODED_URL']) && $_SERVER['UNENCODED_URL'] != '' ) { $requestUri = $_SERVER['UNENCODED_URL']; } elseif (isset($_SERVER['REQUEST_URI'])) { $requestUri = $_SERVER['REQUEST_URI']; // Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path $schemeAndHttpHost = $this->getScheme() . '://' . $this->getHttpHost(); if (strpos($requestUri, $schemeAndHttpHost) === 0) { $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); } } elseif (isset($_SERVER['ORIG_PATH_INFO'])) { // IIS 5.0, PHP as CGI $requestUri = $_SERVER['ORIG_PATH_INFO']; if (!empty($_SERVER['QUERY_STRING'])) { $requestUri .= '?' . $_SERVER['QUERY_STRING']; } } else { return $this; } } elseif (!is_string($requestUri)) { return $this; } else { // Set GET items, if available if (false !== ($pos = strpos($requestUri, '?'))) { // Get key => value pairs and set $_GET $query = substr($requestUri, $pos + 1); parse_str($query, $vars); $this->setQuery($vars); } } $this->_requestUri = $requestUri; return $this; } public function getRequestUri() { if (empty($this->_requestUri)) { $this->setRequestUri(); } return $this->_requestUri; } public function setBaseUrl($baseUrl = null) { if ((null !== $baseUrl) && !is_string($baseUrl)) { return $this; } if ($baseUrl === null) { $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; if (isset($_SERVER['SCRIPT_NAME']) && basename($_SERVER['SCRIPT_NAME']) === $filename) { $baseUrl = $_SERVER['SCRIPT_NAME']; } elseif (isset($_SERVER['PHP_SELF']) && basename($_SERVER['PHP_SELF']) === $filename) { $baseUrl = $_SERVER['PHP_SELF']; } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) { $baseUrl = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility } else { // Backtrack up the script_filename to find the portion matching // php_self $path = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : ''; $file = isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : ''; $segs = explode('/', trim($file, '/')); $segs = array_reverse($segs); $index = 0; $last = count($segs); $baseUrl = ''; do { $seg = $segs[$index]; $baseUrl = '/' . $seg . $baseUrl; ++$index; } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos)); } // Does the baseUrl have anything in common with the request_uri? $requestUri = $this->getRequestUri(); if (0 === strpos($requestUri, $baseUrl)) { // full $baseUrl matches $this->_baseUrl = $baseUrl; return $this; } if (0 === strpos($requestUri, dirname($baseUrl))) { // directory portion of $baseUrl matches $this->_baseUrl = rtrim(dirname($baseUrl), '/'); return $this; } $truncatedRequestUri = $requestUri; if (($pos = strpos($requestUri, '?')) !== false) { $truncatedRequestUri = substr($requestUri, 0, $pos); } $basename = basename($baseUrl); if (empty($basename) || !strpos($truncatedRequestUri, $basename)) { // no match whatsoever; set it blank $this->_baseUrl = ''; return $this; } // If using mod_rewrite or ISAPI_Rewrite strip the script filename // out of baseUrl. $pos !== 0 makes sure it is not matching a value // from PATH_INFO or QUERY_STRING if ((strlen($requestUri) >= strlen($baseUrl)) && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0))) { $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); } } $this->_baseUrl = rtrim($baseUrl, '/'); return $this; } public function getBaseUrl($raw = false) { if (null === $this->_baseUrl) { $this->setBaseUrl(); } return (($raw == false) ? urldecode($this->_baseUrl) : $this->_baseUrl); } public function setBasePath($basePath = null) { if ($basePath === null) { $filename = (isset($_SERVER['SCRIPT_FILENAME'])) ? basename($_SERVER['SCRIPT_FILENAME']) : ''; $baseUrl = $this->getBaseUrl(); if (empty($baseUrl)) { $this->_basePath = ''; return $this; } if (basename($baseUrl) === $filename) { $basePath = dirname($baseUrl); } else { $basePath = $baseUrl; } } if (substr(PHP_OS, 0, 3) === 'WIN') { $basePath = str_replace('\\', '/', $basePath); } $this->_basePath = rtrim($basePath, '/'); return $this; } public function getBasePath() { if (null === $this->_basePath) { $this->setBasePath(); } return $this->_basePath; } public function setPathInfo($pathInfo = null) { if ($pathInfo === null) { $baseUrl = $this->getBaseUrl(); // this actually calls setBaseUrl() & setRequestUri() $baseUrlRaw = $this->getBaseUrl(false); $baseUrlEncoded = urlencode($baseUrlRaw); if (null === ($requestUri = $this->getRequestUri())) { return $this; } // Remove the query string from REQUEST_URI if ($pos = strpos($requestUri, '?')) { $requestUri = substr($requestUri, 0, $pos); } if (!empty($baseUrl) || !empty($baseUrlRaw)) { if (strpos($requestUri, $baseUrl) === 0) { $pathInfo = substr($requestUri, strlen($baseUrl)); } elseif (strpos($requestUri, $baseUrlRaw) === 0) { $pathInfo = substr($requestUri, strlen($baseUrlRaw)); } elseif (strpos($requestUri, $baseUrlEncoded) === 0) { $pathInfo = substr($requestUri, strlen($baseUrlEncoded)); } else { $pathInfo = $requestUri; } } else { $pathInfo = $requestUri; } } $this->_pathInfo = (string) $pathInfo; return $this; } public function getPathInfo() { if (empty($this->_pathInfo)) { $this->setPathInfo(); } return $this->_pathInfo; } public function setParamSources(array $paramSources = array()) { $this->_paramSources = $paramSources; return $this; } public function getParamSources() { return $this->_paramSources; } public function setParam($key, $value) { $key = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; parent::setParam($key, $value); return $this; } public function getParam($key, $default = null) { $keyName = (null !== ($alias = $this->getAlias($key))) ? $alias : $key; $paramSources = $this->getParamSources(); if (isset($this->_params[$keyName])) { return $this->_params[$keyName]; } elseif (in_array('_GET', $paramSources) && (isset($_GET[$keyName]))) { return $_GET[$keyName]; } elseif (in_array('_POST', $paramSources) && (isset($_POST[$keyName]))) { return $_POST[$keyName]; } return $default; } public function getParams() { $return = $this->_params; $paramSources = $this->getParamSources(); if (in_array('_GET', $paramSources) && isset($_GET) && is_array($_GET) ) { $return += $_GET; } if (in_array('_POST', $paramSources) && isset($_POST) && is_array($_POST) ) { $return += $_POST; } return $return; } public function setParams(array $params) { foreach ($params as $key => $value) { $this->setParam($key, $value); } return $this; } public function setAlias($name, $target) { $this->_aliases[$name] = $target; return $this; } public function getAlias($name) { if (isset($this->_aliases[$name])) { return $this->_aliases[$name]; } return null; } public function getAliases() { return $this->_aliases; } public function getMethod() { return $this->getServer('REQUEST_METHOD'); } public function isPost() { if ('POST' == $this->getMethod()) { return true; } return false; } public function isGet() { if ('GET' == $this->getMethod()) { return true; } return false; } public function isPut() { if ('PUT' == $this->getMethod()) { return true; } return false; } public function isDelete() { if ('DELETE' == $this->getMethod()) { return true; } return false; } public function isHead() { if ('HEAD' == $this->getMethod()) { return true; } return false; } public function isOptions() { if ('OPTIONS' == $this->getMethod()) { return true; } return false; } public function isXmlHttpRequest() { return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest'); } public function isFlashRequest() { $header = strtolower($this->getHeader('USER_AGENT')); return (strstr($header, ' flash')) ? true : false; } public function isSecure() { return ($this->getScheme() === self::SCHEME_HTTPS); } public function getRawBody() { if (null === $this->_rawBody) { $body = file_get_contents('php://input'); if (strlen(trim($body)) > 0) { $this->_rawBody = $body; } else { $this->_rawBody = false; } } return $this->_rawBody; } public function getHeader($header) { if (empty($header)) { require_once 'Zend/Controller/Request/Exception.php'; throw new Zend_Controller_Request_Exception('An HTTP header name is required'); } // Try to get it from the $_SERVER array first $temp = 'HTTP_' . strtoupper(str_replace('-', '_', $header)); if (isset($_SERVER[$temp])) { return $_SERVER[$temp]; } // This seems to be the only way to get the Authorization header on // Apache if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); if (isset($headers[$header])) { return $headers[$header]; } $header = strtolower($header); foreach ($headers as $key => $value) { if (strtolower($key) == $header) { return $value; } } } return false; } public function getScheme() { return ($this->getServer('HTTPS') == 'on') ? self::SCHEME_HTTPS : self::SCHEME_HTTP; } public function getHttpHost() { $host = $this->getServer('HTTP_HOST'); if (!empty($host)) { return $host; } $scheme = $this->getScheme(); $name = $this->getServer('SERVER_NAME'); $port = $this->getServer('SERVER_PORT'); if(null === $name) { return ''; } elseif (($scheme == self::SCHEME_HTTP && $port == 80) || ($scheme == self::SCHEME_HTTPS && $port == 443)) { return $name; } else { return $name . ':' . $port; } } public function getClientIp($checkProxy = true) { if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) { $ip = $this->getServer('HTTP_CLIENT_IP'); } else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) { $ip = $this->getServer('HTTP_X_FORWARDED_FOR'); } else { $ip = $this->getServer('REMOTE_ADDR'); } return $ip; } }
從上述類(lèi)的實(shí)現(xiàn),不難看出,類(lèi)為我們提供了很多方便的方法來(lái)獲取需要的數(shù)據(jù)。例如:
模塊名可通過(guò)getModuleName()和setModuleName()訪(fǎng)問(wèn)。
控制器名可通過(guò)getControllerName()和setControllerName()訪(fǎng)問(wèn)。
控制器調(diào)用的動(dòng)作名稱(chēng)可通過(guò)getActionName()和setActionName()訪(fǎng)問(wèn)。
可訪(fǎng)問(wèn)的參數(shù)是一個(gè)鍵值對(duì)的關(guān)聯(lián)數(shù)組。數(shù)組可通過(guò)getParams()和 setParams()獲取及設(shè)置,單個(gè)參數(shù)可以通過(guò) getParam() 和 setParam()獲取及設(shè)置。
基于請(qǐng)求的類(lèi)型存在更多的可用方法。默認(rèn)的Zend_Controller_Request_Http請(qǐng)求對(duì)象,擁有訪(fǎng)問(wèn)請(qǐng)求url、路徑信息、$_GET 和 $_POST參數(shù)的方法等等。
請(qǐng)求對(duì)象先被傳入到前端控制器。如果沒(méi)有提供請(qǐng)求對(duì)象,它將在分發(fā)過(guò)程的開(kāi)始、任何路由過(guò)程發(fā)生之前實(shí)例化。請(qǐng)求對(duì)象將被傳遞到分發(fā)鏈中的每個(gè)對(duì)象。
而且,請(qǐng)求對(duì)象在測(cè)試中是很有用的。開(kāi)發(fā)人員可根據(jù)需要搭建請(qǐng)求環(huán)境,包括模塊、控制器、動(dòng)作、參數(shù)、URI等等,并且將其傳入前端控制器來(lái)測(cè)試程序流向。如果與響應(yīng)對(duì)象配合,可以對(duì)MVC程序進(jìn)行精確巧妙的單元測(cè)試(unit testing)。
HTTP 請(qǐng)求
訪(fǎng)問(wèn)請(qǐng)求數(shù)據(jù)
Zend_Controller_Request_Http封裝了對(duì)相關(guān)值的訪(fǎng)問(wèn),如控制器和動(dòng)作路由器變量的鍵名和值,從URL解析的附加參數(shù)。它還允許訪(fǎng)問(wèn)作為公共成員的超全局變量,管理當(dāng)前的基地址(Base URL)和請(qǐng)求URI。超全局變量不能在請(qǐng)求對(duì)象中賦值,但可以通過(guò)setParam/getParam方法設(shè)定/獲取用戶(hù)參數(shù)。
Note: 超全局?jǐn)?shù)據(jù)
通過(guò)Zend_Controller_Request_Http訪(fǎng)問(wèn)公共成員屬性的超全局?jǐn)?shù)據(jù),有必要認(rèn)識(shí)到一點(diǎn),這些屬性名(超全局?jǐn)?shù)組的鍵)按照特定次序匹配超全局變量:1. GET,2.POST,3. COOKIE,4. SERVER,5. ENV。
特定的超全局變量也可以選擇特定的方法來(lái)訪(fǎng)問(wèn),如$_POST['user']可以調(diào)用請(qǐng)求對(duì)象的getPost('user')訪(fǎng)問(wèn),getQuery()可以獲取$_GET元素,getHeader()可以獲取請(qǐng)求消息頭。
Note: GET和POST數(shù)據(jù)
需要注意:在請(qǐng)求對(duì)象中訪(fǎng)問(wèn)數(shù)據(jù)是沒(méi)有經(jīng)過(guò)任何過(guò)濾的,路由器和分發(fā)器根據(jù)任務(wù)來(lái)驗(yàn)證過(guò)濾數(shù)據(jù),但在請(qǐng)求對(duì)象中沒(méi)有任何處理。
Note: 也獲取原始 (Raw) POST 數(shù)據(jù)!
從 1.5.0 開(kāi)始,也可以通過(guò) getRawBody() 方法獲取原始 post 數(shù)據(jù)。如果沒(méi)有數(shù)據(jù)以那種方式提交,該方法返回 false,但 post 的全體(full boday)是個(gè)例外。
當(dāng)開(kāi)發(fā)一個(gè) RESTful MVC 程序,這個(gè)對(duì)于接受內(nèi)容相當(dāng)有用。
可以在請(qǐng)求對(duì)象中使用setParam() 和getParam()來(lái)設(shè)置和獲取用戶(hù)參數(shù)。 路由器根據(jù)請(qǐng)求URI中的參數(shù),利用這項(xiàng)功能請(qǐng)求對(duì)象設(shè)定參數(shù)。
Note: getParam()不只可以獲取用戶(hù)參數(shù)
getParam()事實(shí)上從幾個(gè)資源中獲取參數(shù)。根據(jù)優(yōu)先級(jí)排序:通過(guò)setParam()設(shè)置的用戶(hù)參數(shù),GET 參數(shù),最后是POST參數(shù)。 通過(guò)該方法獲取數(shù)據(jù)時(shí)需要注意這點(diǎn)。
如果你希望從你通過(guò) setParam() 設(shè)置的參數(shù)中獲取(參數(shù)),使用 getUserParam()。
另外,從 1.5.0 開(kāi)始,可以鎖定搜索哪個(gè)參數(shù)源,setParamSources() 允許指定一個(gè)空數(shù)組或者一個(gè)帶有一個(gè)或多個(gè)指示哪個(gè)參數(shù)源被允許(缺省兩者都被允許)的值 '_GET'或'_POST'的數(shù)組;如果想限制只訪(fǎng)問(wèn) '_GET',那么指定 setParamSources(array('_GET')) 。
Note: Apache相關(guān)
如果使用apache的404處理器來(lái)傳遞請(qǐng)求到前端控制器,或者使用重寫(xiě)規(guī)則(rewrite rules)的PT標(biāo)志,URI包含在$_SERVER['REDIRECT_URL'],而不是$_SERVER['REQUEST_URI']。如果使用這樣的設(shè)定并獲取無(wú)效的路由,應(yīng)該使用Zend_Controller_Request_Apache404類(lèi)代替默認(rèn)的HTTP類(lèi):
$request = new Zend_Controller_Request_Apache404(); $front->setRequest($request);
這個(gè)類(lèi)繼承了Zend_Controller_Request_Http,并簡(jiǎn)單的修改了請(qǐng)求URI的自動(dòng)發(fā)現(xiàn)(autodiscovery),它可以用來(lái)作為簡(jiǎn)易替換器件(drop-in replacement)。
基地址和子目錄
Zend_Controller_Request_Http允許在子目錄中使用Zend_Controller_Router_Rewrite。Zend_Controller_Request_Http試圖自動(dòng)的檢測(cè)你的基地址,并進(jìn)行相應(yīng)的設(shè)置。
例如,如果將 index.php 放在web服務(wù)器的名為/projects/myapp/index.php子目錄中,基地址應(yīng)該被設(shè)置為/projects/myapp。計(jì)算任何路由匹配之前將先從路徑中去除這個(gè)字符串。這個(gè)字串需要被加入到任何路由前面。路由 'user/:username'將匹配類(lèi)似http://localhost/projects/myapp/user/martel 和http://example.com/user/martel的URL。
Note: URL檢測(cè)區(qū)分大小寫(xiě)
基地址的自動(dòng)檢測(cè)是區(qū)分大小寫(xiě)的,因此需要確保URL與文件系統(tǒng)中的子目錄匹配。否則將會(huì)引發(fā)異常。
如果基地址經(jīng)檢測(cè)不正確,可以利用Zend_Controller_Request_Http或者Zend_Controller_Front類(lèi)的setBaseUrl()方法設(shè)置自己的基路徑。Zend_Controller_Front設(shè)置最容易,它將導(dǎo)入基地址到請(qǐng)求對(duì)象。定制基地址的用法舉例:
/** * Dispatch Request with custom base URL with Zend_Controller_Front. */ $router = new Zend_Controller_Router_Rewrite(); $controller = Zend_Controller_Front::getInstance(); $controller->setControllerDirectory('./application/controllers') ->setRouter($router) ->setBaseUrl('/projects/myapp'); // set the base url! $response = $controller->dispatch();
判斷請(qǐng)求方式
getMethod() 允許你決定用于請(qǐng)求當(dāng)前資源的 HTTP 請(qǐng)求方法。另外,當(dāng)詢(xún)問(wèn)是否一個(gè)請(qǐng)求的特定類(lèi)型是否已經(jīng)存在,有許多方法允許你獲得布爾響應(yīng):
isGet()
isPost()
isPut()
isDelete()
isHead()
isOptions()
這些基本用例是來(lái)創(chuàng)建 RESTful MVC 架構(gòu)的。
AJAX 請(qǐng)求
Zend_Controller_Request_Http 有一個(gè)初步的方法用來(lái)檢測(cè)AJAX請(qǐng)求:isXmlHttpRequest()。這個(gè)方法尋找一個(gè)帶有'XMLHttpRequest' 值的HTTP請(qǐng)求頭X-Requested-With;如果發(fā)現(xiàn),就返回true。
當(dāng)前,這個(gè)頭用下列JS庫(kù)缺省地傳遞:
Prototype/Scriptaculous (and libraries derived from Prototype)
Yahoo! UI Library
jQuery
MochiKit
大多數(shù) AJAX 庫(kù)允許發(fā)送定制的HTTP請(qǐng)求頭;如果你的庫(kù)沒(méi)有發(fā)送這個(gè)頭,簡(jiǎn)單地把它作為一個(gè)請(qǐng)求頭添加上確保isXmlHttpRequest() 方法工作。
子類(lèi)化請(qǐng)求對(duì)象。
請(qǐng)求對(duì)象是請(qǐng)求環(huán)境的容器。控制器鏈實(shí)際上只需要知道如何設(shè)置和獲取控制器、動(dòng)作,可選的參數(shù)以及分發(fā)的狀態(tài)。默認(rèn)的,請(qǐng)求將使用controller和action鍵查詢(xún)自己的參數(shù)來(lái)確定控制器和動(dòng)作。
需要一個(gè)請(qǐng)求類(lèi)來(lái)與特定的環(huán)境交互以獲得需要的數(shù)據(jù)時(shí),可以擴(kuò)展該基類(lèi)或它的衍生類(lèi)。例如HTTP環(huán)境,CLI環(huán)境,或者PHP-GTK環(huán)境。
更多關(guān)于zend相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Zend FrameWork框架入門(mén)教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《Yii框架入門(mén)及常用技巧總結(jié)》、《ThinkPHP入門(mén)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- Zend的Registry機(jī)制的使用說(shuō)明
- Zend Framework教程之響應(yīng)對(duì)象的封裝Zend_Controller_Response實(shí)例詳解
- zend api擴(kuò)展的php對(duì)象的autoload工具
- Zend Framework實(shí)現(xiàn)多服務(wù)器共享SESSION數(shù)據(jù)的方法
- Zend Framework框架Smarty擴(kuò)展實(shí)現(xiàn)方法
- Zend Framework框架路由機(jī)制代碼分析
- Zend Framework實(shí)現(xiàn)留言本分頁(yè)功能(附demo源碼下載)
- Zend Framework實(shí)現(xiàn)具有基本功能的留言本(附demo源碼下載)
- Zend Framework實(shí)現(xiàn)將session存儲(chǔ)在memcache中的方法
- Zend Framework分頁(yè)類(lèi)用法詳解
- Zend Framework入門(mén)之環(huán)境配置及第一個(gè)Hello World示例(附demo源碼下載)
- Zend Framework入門(mén)知識(shí)點(diǎn)小結(jié)
- Zend Framework緩存Cache用法簡(jiǎn)單實(shí)例
- Zend Framework教程之Zend_Registry對(duì)象用法分析
相關(guān)文章
Redis使用Eval多個(gè)鍵值自增的操作實(shí)例
下面小編就為大家?guī)?lái)一篇Redis使用Eval 多個(gè)鍵值自增的操作實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11修改apache配置文件去除thinkphp url中的index.php
這篇文章主要介紹了修改apache配置文件去除thinkphp url中的index.php的方法,大家參考使用吧2014-01-01簡(jiǎn)單的php緩存類(lèi)分享 php緩存機(jī)制
這篇文章主要介紹了一個(gè)php緩存類(lèi),文件名使用md5加密,大家參考使用吧2014-01-01詳解laravel passport OAuth2.0的4種模式
這篇文章主要介紹了laravel passport OAuth2.0的4種模式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11php calender(日歷)二個(gè)版本代碼示例(解決2038問(wèn)題)
一個(gè)簡(jiǎn)單的php Calender(日歷),解決了2038問(wèn)題,這樣在32位機(jī)和64位機(jī)上都可以用了,代碼很簡(jiǎn)單,方便修改2013-12-12PHP編寫(xiě)的圖片驗(yàn)證碼類(lèi)文件分享
本文給大家匯總介紹了3種php編寫(xiě)的圖片驗(yàn)證碼類(lèi),代碼都非常的簡(jiǎn)單實(shí)用,有相同需求的小伙伴可以收藏下。2016-06-06php 無(wú)限分類(lèi) 樹(shù)形數(shù)據(jù)格式化代碼
這篇文章主要介紹了php 無(wú)限分類(lèi) 樹(shù)形數(shù)據(jù)格式化代碼,需要的朋友可以參考下2016-10-10