搜尋
首頁後端開發php教程Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解_PHP

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

概述

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

请求对象的基本实现

├── Request
│   ├── Abstract.php
│   ├── Apache404.php
│   ├── Exception.php
│   ├── Http.php
│   ├── HttpTestCase.php
│   └── Simple.php

Zend_Controller_Request_Abstract

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

<&#63;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 &#63; true : false;
    return $this;
  }
  public function isDispatched()
  {
    return $this->_dispatched;
  }
}

Zend_Controller_Request_Http

Zend_Controller_Request请求对象的默认实现。

<&#63;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 .= '&#63;' . $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])) &#63; $_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])) &#63; $_POST[$key] : $default;
  }
  public function getCookie($key = null, $default = null)
  {
    if (null === $key) {
      return $_COOKIE;
    }
    return (isset($_COOKIE[$key])) &#63; $_COOKIE[$key] : $default;
  }
  public function getServer($key = null, $default = null)
  {
    if (null === $key) {
      return $_SERVER;
    }
    return (isset($_SERVER[$key])) &#63; $_SERVER[$key] : $default;
  }
  public function getEnv($key = null, $default = null)
  {
    if (null === $key) {
      return $_ENV;
    }
    return (isset($_ENV[$key])) &#63; $_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 .= '&#63;' . $_SERVER['QUERY_STRING'];
        }
      } else {
        return $this;
      }
    } elseif (!is_string($requestUri)) {
      return $this;
    } else {
      // Set GET items, if available
      if (false !== ($pos = strpos($requestUri, '&#63;'))) {
        // 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'])) &#63; 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']) &#63; $_SERVER['PHP_SELF'] : '';
        $file  = isset($_SERVER['SCRIPT_FILENAME']) &#63; $_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&#63;
      $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, '&#63;')) !== 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) &#63; urldecode($this->_baseUrl) : $this->_baseUrl);
  }
  public function setBasePath($basePath = null)
  {
    if ($basePath === null) {
      $filename = (isset($_SERVER['SCRIPT_FILENAME']))
           &#63; 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, '&#63;')) {
        $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))) &#63; $alias : $key;
    parent::setParam($key, $value);
    return $this;
  }
  public function getParam($key, $default = null)
  {
    $keyName = (null !== ($alias = $this->getAlias($key))) &#63; $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')) &#63; 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') &#63; 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;
  }
}

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

模块名可通过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设置最容易,它将导入基地址到请求对象。定制基地址的用法举例:

/**
 * 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();

判断请求方式

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

isGet()
isPost()
isPut()
isDelete()
isHead()
isOptions()

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

AJAX 请求

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

当前,这个头用下列JS库缺省地传递:
Prototype/Scriptaculous (and libraries derived from Prototype)
Yahoo! UI Library
jQuery
MochiKit

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

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

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

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Microsoft NET Framework 安装问题 错误代码 0x800c0006 修复Microsoft NET Framework 安装问题 错误代码 0x800c0006 修复May 05, 2023 pm 04:01 PM

.NETFramework4是开发人员和最终用户在Windows上运行最新版本的应用程序所必需的。但是,在下载安装.NETFramework4时,许多用户抱怨安装程序在中途停止,显示以下错误消息-“ .NETFramework4hasnotbeeninstalledbecauseDownloadfailedwitherrorcode0x800c0006 ”。在您的设备上安装.NETFramework4时,如果您也在体验它,那么您就来对了地方

如何在 Windows 11/10 上使用 SetupDiag 识别 Windows 升级问题如何在 Windows 11/10 上使用 SetupDiag 识别 Windows 升级问题Apr 17, 2023 am 10:07 AM

每当您的Windows11或Windows10PC出现升级或更新问题时,您通常会看到一个错误代码,指示故障背后的实际原因。但是,有时,升级或更新失败可能不会显示错误代码,这时就会出现混淆。有了方便的错误代码,您就可以确切地知道问题出在哪里,因此您可以尝试修复。但是由于没有出现错误代码,因此识别问题并解决它变得极具挑战性。这会占用您大量时间来简单地找出错误背后的原因。在这种情况下,您可以尝试使用Microsoft提供的名为SetupDiag的专用工具,该工具可帮助您轻松识别错误背后的真

SCNotification 已停止工作 [修复它的 5 个步骤]SCNotification 已停止工作 [修复它的 5 个步骤]May 17, 2023 pm 09:35 PM

作为Windows用户,您很可能会在每次启动计算机时遇到SCNotification已停止工作错误。SCNotification.exe是一个微软系统通知文件,由于权限错误和点网故障等原因,每次启动PC时都会崩溃。此错误也以其问题事件名称而闻名。因此,您可能不会将其视为SCNotification已停止工作,而是将其视为错误clr20r3。在本文中,我们将探讨您需要采取的所有步骤来修复SCNotification已停止工作,以免它再次困扰您。什么是SCNotification.e

Microsoft .NET Framework 4.5.2、4.6 和 4.6.1 将于 2022 年 4 月终止支持Microsoft .NET Framework 4.5.2、4.6 和 4.6.1 将于 2022 年 4 月终止支持Apr 17, 2023 pm 02:25 PM

已安装Microsoft.NET版本4.5.2、4.6或4.6.1的MicrosoftWindows用户如果希望Microsoft将来通过产品更新支持该框架,则必须安装较新版本的Microsoft框架。据微软称,这三个框架都将在2022年4月26日停止支持。支持日期结束后,产品将不会收到“安全修复或技术支持”。大多数家庭设备通过Windows更新保持最新。这些设备已经安装了较新版本的框架,例如.NETFramework4.8。未自动更新的设备可能

适用于 Windows 11 的KB5012643破坏了.NET Framework 3.5应用程序适用于 Windows 11 的KB5012643破坏了.NET Framework 3.5应用程序May 09, 2023 pm 01:07 PM

自我们谈论影响安装KB5012643forWindows11的用户的新安全模式错误以来已经过去了一周。这个讨厌的问题并没有出现在微软在发布当天发布的已知问题列表中,因此让所有人都感到意外。好吧,就在您认为情况不会变得更糟的时候,微软为安装此累积更新的用户投下了另一颗炸弹。Windows11Build22000.652导致更多问题因此,这家科技公司警告Windows11用户,他们在启动和使用某些.NETFramework3.5应用程序时可能会遇到问题。听起来很熟悉?不过请不要惊

如何在Zend框架中使用ACL(Access Control List)进行权限控制如何在Zend框架中使用ACL(Access Control List)进行权限控制Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)进行权限控制导言:在一个Web应用程序中,权限控制是至关重要的一项功能。它可以确保用户只能访问其有权访问的页面和功能,并防止未经授权的访问。Zend框架提供了一种方便的方法来实现权限控制,即使用ACL(AccessControlList)组件。本文将介绍如何在Zend框架中使用ACL

PHP实现框架:Zend Framework入门教程PHP实现框架:Zend Framework入门教程Jun 19, 2023 am 08:09 AM

PHP实现框架:ZendFramework入门教程ZendFramework是PHP开发的一种开源网站框架,目前由ZendTechnologies维护,ZendFramework采用了MVC设计模式,提供了一系列可重用的代码库,服务于实现Web2.0应用程序和Web服务。ZendFramework深受PHP开发者的欢迎和推崇,拥有广泛

酷冷至尊携手Framework推出创新迷你机箱套件,兼容笔记本主板酷冷至尊携手Framework推出创新迷你机箱套件,兼容笔记本主板Dec 15, 2023 pm 05:35 PM

12月9日消息,最近,酷冷至尊在台北电脑展上的一次展示活动中,展示了与笔记本模块化方案提供商framework合作的迷你机箱套件,这个套件的独特之处在于,它可以兼容并安装来自framework笔记本的主板。目前,这款产品已经开始在市场上销售,售价定为39美元,按当前汇率折合大约279元人民币。这款机箱套件的型号被命名为“frameWORKMAINBOARDCASE”。在设计方面,它体现了极致的紧凑与实用性,尺寸仅为297x133x15毫米。它的设计初衷是为了能够无缝接入framework笔记本的

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。