Zend Framework教程之请求对象的封装Zend_Controller_Request实例有哪些?

Zend Framework教程之请求对象的封装Zend_Controller_Request实例有哪些?

本文实例讲述了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

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

<?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请求对象的默认实现。

<?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;
 }
}

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

模块名可通过getModuleName()和setModuleName()访问。
控制器名可通过getControllerName()和setControllerName()访问。
控制器调用的动作名称可通过getActionName()和setActionName()访问。
可访问的参数是一个键值对的关联数组。数组可通过getParams()和 setParams()获取及设置,单个参数可以通过 getParam() 和 setParam()获取及设置。

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

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

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

HTTP 请求

访问请求数据

Note: 超全局数据

特定的超全局变量也可以选择特定的方法来访问,如$_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相关

$request = new Zend_Controller_Request_Apache404();
$front->setRequest($request);

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

Note: URL检测区分大小写

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

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

判断请求方式

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

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

AJAX 请求

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

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

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

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