백엔드 개발 PHP 튜토리얼 Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解_PHP

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

May 27, 2016 am 10:36 AM
framework zend

本文实例讲述了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으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Microsoft NET Framework 설치 문제 오류 코드 0x800c0006 수정 Microsoft NET Framework 설치 문제 오류 코드 0x800c0006 수정 May 05, 2023 pm 04:01 PM

.NET Framework 4는 개발자와 최종 사용자가 Windows에서 최신 버전의 애플리케이션을 실행하는 데 필요합니다. 그러나 .NET Framework 4를 다운로드하고 설치하는 동안 많은 사용자가 설치 프로그램이 중간에 중지되고 "오류 코드 0x800c0006으로 인해 다운로드에 실패했기 때문에 .NET Framework 4가 설치되지 않았습니다"라는 오류 메시지가 표시된다고 불평했습니다. 장치에 .NETFramework4를 설치하는 동안에도 이 문제가 발생한다면 올바른 위치에 있는 것입니다.

Windows 11/10에서 SetupDiag를 사용하여 Windows 업그레이드 문제를 식별하는 방법 Windows 11/10에서 SetupDiag를 사용하여 Windows 업그레이드 문제를 식별하는 방법 Apr 17, 2023 am 10:07 AM

Windows 11 또는 Windows 10 PC에 업그레이드 또는 업데이트 문제가 있을 때마다 일반적으로 실패의 실제 원인을 나타내는 오류 코드가 표시됩니다. 그러나 오류 코드가 표시되지 않고 업그레이드나 업데이트가 실패하면 혼란이 발생할 수 있습니다. 편리한 오류 코드를 사용하면 문제가 어디에 있는지 정확히 알 수 있으므로 문제를 해결할 수 있습니다. 하지만 오류 코드가 나타나지 않기 때문에 문제를 식별하고 해결하기가 어렵습니다. 단순히 오류의 원인을 찾는 데 많은 시간이 걸립니다. 이 경우 오류의 실제 원인을 쉽게 식별하는 데 도움이 되는 Microsoft에서 제공하는 SetupDiag라는 전용 도구를 사용해 볼 수 있습니다.

SCNotification이 작동을 멈췄습니다. [수정을 위한 5단계] SCNotification이 작동을 멈췄습니다. [수정을 위한 5단계] May 17, 2023 pm 09:35 PM

Windows 사용자는 컴퓨터를 시작할 때마다 SCNotification이 작동을 중지했습니다. 오류가 발생할 수 있습니다. SCNotification.exe는 권한 오류 및 네트워크 오류로 인해 PC를 시작할 때마다 충돌이 발생하는 Microsoft 시스템 알림 파일입니다. 이 오류는 문제가 있는 이벤트 이름으로도 알려져 있습니다. 따라서 이를 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을 설치한 Microsoft Windows 사용자가 Microsoft에서 향후 제품 업데이트를 통해 프레임워크를 지원하도록 하려면 최신 버전의 Microsoft Framework를 설치해야 합니다. Microsoft에 따르면 세 가지 프레임워크 모두 2022년 4월 26일에 지원이 중단됩니다. 지원 날짜가 종료되면 해당 제품은 "보안 수정 또는 기술 지원"을 받을 수 없습니다. 대부분의 가정용 장치는 Windows 업데이트를 통해 최신 상태로 유지됩니다. 이러한 장치에는 .NET Framework 4.8과 같은 최신 버전의 프레임워크가 이미 설치되어 있습니다. 자동으로 업데이트되지 않는 장치는

Windows 11용 KB5012643으로 인해 .NET Framework 3.5 앱이 중단됨 Windows 11용 KB5012643으로 인해 .NET Framework 3.5 앱이 중단됨 May 09, 2023 pm 01:07 PM

Windows 11용 KB5012643을 설치한 사용자에게 영향을 미치는 새로운 안전 모드 버그에 대해 이야기한 지 일주일이 지났습니다. 이 성가신 문제는 Microsoft가 출시일에 게시한 알려진 문제 목록에 나타나지 않아 모두를 놀라게 했습니다. 글쎄, 상황이 더 이상 악화될 수 없다고 생각했을 때 Microsoft는 이 누적 업데이트를 설치한 사용자에게 또 다른 폭탄을 떨어뜨렸습니다. Windows 11 빌드 22000.652로 인해 더 많은 문제 발생 따라서 기술 회사는 Windows 11 사용자에게 일부 .NET Framework 3.5 응용 프로그램을 시작하고 사용하는 데 문제가 발생할 수 있다고 경고합니다. 익숙한 것 같나요? 하지만 놀라지 마세요.

Zend Framework에서 권한 제어를 위해 ACL(Access Control List)을 사용하는 방법 Zend Framework에서 권한 제어를 위해 ACL(Access Control List)을 사용하는 방법 Jul 29, 2023 am 09:24 AM

Zend Framework에서 권한 제어를 위해 ACL(AccessControlList)을 사용하는 방법 소개: 웹 애플리케이션에서 권한 제어는 중요한 기능입니다. 이는 사용자가 액세스 권한이 있는 페이지와 기능에만 액세스할 수 있도록 하고 무단 액세스를 방지합니다. Zend 프레임워크는 ACL(AccessControlList) 구성 요소를 사용하여 권한 제어를 구현하는 편리한 방법을 제공합니다. 이 기사에서는 Zend Framework에서 ACL을 사용하는 방법을 소개합니다.

PHP 구현 프레임워크: Zend 프레임워크 시작 튜토리얼 PHP 구현 프레임워크: Zend 프레임워크 시작 튜토리얼 Jun 19, 2023 am 08:09 AM

PHP 구현 프레임워크: ZendFramework 입문 튜토리얼 ZendFramework는 PHP에서 개발하고 현재 ZendTechnologies에서 유지 관리하는 오픈 소스 웹 사이트 프레임워크입니다. ZendFramework는 MVC 디자인 패턴을 채택하고 Web2.0 애플리케이션 및 Web Serve 구현을 지원하기 위한 재사용 가능한 코드 라이브러리 시리즈를 제공합니다. ZendFramework는 PHP 개발자들에게 매우 인기 있고 존경받고 있으며 다양한 기능을 갖추고 있습니다.

Cooler Master 및 Framework, 노트북 마더보드와 호환되는 혁신적인 미니 케이스 키트 출시 Cooler Master 및 Framework, 노트북 마더보드와 호환되는 혁신적인 미니 케이스 키트 출시 Dec 15, 2023 pm 05:35 PM

12월 9일 뉴스에 따르면 Cooler Master는 최근 타이페이 컴퓨트 쇼(Taipei Compute Show)의 시연 행사에서 노트북 모듈 솔루션 제공업체인 Framework와 협력하여 미니 섀시 키트를 시연했습니다. 프레임워크 노트북에서. 현재 이 제품은 시중에 판매되기 시작했으며 가격은 39달러로 현재 환율로 약 279위안(한화 약 279위안)에 해당한다. 이 섀시 키트의 모델 번호는 "frameWORKMAINBOARDCASE"로 명명됩니다. 디자인 측면에서는 297x133x15mm 크기로 최고의 컴팩트함과 실용성을 구현합니다. 원래 디자인은 프레임워크 노트북에 원활하게 연결할 수 있도록 하는 것입니다.

See all articles