Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
本文实例讲述了ZendFramework教程之请求对象的封装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 abstractclassZend_Controller_Request_Abstract { protected$_dispatched=false; protected$_module; protected$_moduleKey='module'; protected$_controller; protected$_controllerKey='controller'; protected$_action; protected$_actionKey='action'; protected$_params=array(); publicfunctiongetModuleName() { if(null===$this->_module){ $this->_module=$this->getParam($this->getModuleKey()); } return$this->_module; } publicfunctionsetModuleName($value) { $this->_module=$value; return$this; } publicfunctiongetControllerName() { if(null===$this->_controller){ $this->_controller=$this->getParam($this->getControllerKey()); } return$this->_controller; } publicfunctionsetControllerName($value) { $this->_controller=$value; return$this; } publicfunctiongetActionName() { if(null===$this->_action){ $this->_action=$this->getParam($this->getActionKey()); } return$this->_action; } publicfunctionsetActionName($value) { $this->_action=$value; /** *@seeZF-3465 */ if(null===$value){ $this->setParam($this->getActionKey(),$value); } return$this; } publicfunctiongetModuleKey() { return$this->_moduleKey; } publicfunctionsetModuleKey($key) { $this->_moduleKey=(string)$key; return$this; } publicfunctiongetControllerKey() { return$this->_controllerKey; } publicfunctionsetControllerKey($key) { $this->_controllerKey=(string)$key; return$this; } publicfunctiongetActionKey() { return$this->_actionKey; } publicfunctionsetActionKey($key) { $this->_actionKey=(string)$key; return$this; } publicfunctiongetParam($key,$default=null) { $key=(string)$key; if(isset($this->_params[$key])){ return$this->_params[$key]; } return$default; } publicfunctiongetUserParams() { return$this->_params; } publicfunctiongetUserParam($key,$default=null) { if(isset($this->_params[$key])){ return$this->_params[$key]; } return$default; } publicfunctionsetParam($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; } publicfunctiongetParams() { return$this->_params; } publicfunctionsetParams(array$array) { $this->_params=$this->_params+(array)$array; foreach($arrayas$key=>$value){ if(null===$value){ unset($this->_params[$key]); } } return$this; } publicfunctionclearParams() { $this->_params=array(); return$this; } publicfunctionsetDispatched($flag=true) { $this->_dispatched=$flag?true:false; return$this; } publicfunctionisDispatched() { return$this->_dispatched; } }
Zend_Controller_Request_Http
Zend_Controller_Request请求对象的默认实现。
<?php require_once'Zend/Controller/Request/Abstract.php'; require_once'Zend/Uri.php'; classZend_Controller_Request_HttpextendsZend_Controller_Request_Abstract { constSCHEME_HTTP='http'; constSCHEME_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(); publicfunction__construct($uri=null) { if(null!==$uri){ if(!$uriinstanceofZend_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'; thrownewZend_Controller_Request_Exception('InvalidURIprovidedtoconstructor'); } }else{ $this->setRequestUri(); } } publicfunction__get($key) { switch(true){ caseisset($this->_params[$key]): return$this->_params[$key]; caseisset($_GET[$key]): return$_GET[$key]; caseisset($_POST[$key]): return$_POST[$key]; caseisset($_COOKIE[$key]): return$_COOKIE[$key]; case($key=='REQUEST_URI'): return$this->getRequestUri(); case($key=='PATH_INFO'): return$this->getPathInfo(); caseisset($_SERVER[$key]): return$_SERVER[$key]; caseisset($_ENV[$key]): return$_ENV[$key]; default: returnnull; } } publicfunctionget($key) { return$this->__get($key); } publicfunction__set($key,$value) { require_once'Zend/Controller/Request/Exception.php'; thrownewZend_Controller_Request_Exception('Settingvaluesinsuperglobalsnotallowed;pleaseusesetParam()'); } publicfunctionset($key,$value) { return$this->__set($key,$value); } publicfunction__isset($key) { switch(true){ caseisset($this->_params[$key]): returntrue; caseisset($_GET[$key]): returntrue; caseisset($_POST[$key]): returntrue; caseisset($_COOKIE[$key]): returntrue; caseisset($_SERVER[$key]): returntrue; caseisset($_ENV[$key]): returntrue; default: returnfalse; } } publicfunctionhas($key) { return$this->__isset($key); } publicfunctionsetQuery($spec,$value=null) { if((null===$value)&&!is_array($spec)){ require_once'Zend/Controller/Exception.php'; thrownewZend_Controller_Exception('InvalidvaluepassedtosetQuery();mustbeeitherarrayofvaluesorkey/valuepair'); } if((null===$value)&&is_array($spec)){ foreach($specas$key=>$value){ $this->setQuery($key,$value); } return$this; } $_GET[(string)$spec]=$value; return$this; } publicfunctiongetQuery($key=null,$default=null) { if(null===$key){ return$_GET; } return(isset($_GET[$key]))?$_GET[$key]:$default; } publicfunctionsetPost($spec,$value=null) { if((null===$value)&&!is_array($spec)){ require_once'Zend/Controller/Exception.php'; thrownewZend_Controller_Exception('InvalidvaluepassedtosetPost();mustbeeitherarrayofvaluesorkey/valuepair'); } if((null===$value)&&is_array($spec)){ foreach($specas$key=>$value){ $this->setPost($key,$value); } return$this; } $_POST[(string)$spec]=$value; return$this; } publicfunctiongetPost($key=null,$default=null) { if(null===$key){ return$_POST; } return(isset($_POST[$key]))?$_POST[$key]:$default; } publicfunctiongetCookie($key=null,$default=null) { if(null===$key){ return$_COOKIE; } return(isset($_COOKIE[$key]))?$_COOKIE[$key]:$default; } publicfunctiongetServer($key=null,$default=null) { if(null===$key){ return$_SERVER; } return(isset($_SERVER[$key]))?$_SERVER[$key]:$default; } publicfunctiongetEnv($key=null,$default=null) { if(null===$key){ return$_ENV; } return(isset($_ENV[$key]))?$_ENV[$key]:$default; } publicfunctionsetRequestUri($requestUri=null) { if($requestUri===null){ if(isset($_SERVER['HTTP_X_REWRITE_URL'])){//checkthisfirstsoIISwillcatch $requestUri=$_SERVER['HTTP_X_REWRITE_URL']; }elseif( //IIS7withURLRewrite:makesurewegettheunencodedurl(doubleslashproblem) 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']; //Httpproxyreqssetuprequesturiwithschemeandhost[andport]+theurlpath,onlyuseurlpath $schemeAndHttpHost=$this->getScheme().'://'.$this->getHttpHost(); if(strpos($requestUri,$schemeAndHttpHost)===0){ $requestUri=substr($requestUri,strlen($schemeAndHttpHost)); } }elseif(isset($_SERVER['ORIG_PATH_INFO'])){//IIS5.0,PHPasCGI $requestUri=$_SERVER['ORIG_PATH_INFO']; if(!empty($_SERVER['QUERY_STRING'])){ $requestUri.='?'.$_SERVER['QUERY_STRING']; } }else{ return$this; } }elseif(!is_string($requestUri)){ return$this; }else{ //SetGETitems,ifavailable if(false!==($pos=strpos($requestUri,'?'))){ //Getkey=>valuepairsandset$_GET $query=substr($requestUri,$pos+1); parse_str($query,$vars); $this->setQuery($vars); } } $this->_requestUri=$requestUri; return$this; } publicfunctiongetRequestUri() { if(empty($this->_requestUri)){ $this->setRequestUri(); } return$this->_requestUri; } publicfunctionsetBaseUrl($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'];//1and1sharedhostingcompatibility }else{ //Backtrackupthescript_filenametofindtheportionmatching //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)); } //DoesthebaseUrlhaveanythingincommonwiththerequest_uri? $requestUri=$this->getRequestUri(); if(0===strpos($requestUri,$baseUrl)){ //full$baseUrlmatches $this->_baseUrl=$baseUrl; return$this; } if(0===strpos($requestUri,dirname($baseUrl))){ //directoryportionof$baseUrlmatches $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)){ //nomatchwhatsoever;setitblank $this->_baseUrl=''; return$this; } //Ifusingmod_rewriteorISAPI_Rewritestripthescriptfilename //outofbaseUrl.$pos!==0makessureitisnotmatchingavalue //fromPATH_INFOorQUERY_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; } publicfunctiongetBaseUrl($raw=false) { if(null===$this->_baseUrl){ $this->setBaseUrl(); } return(($raw==false)?urldecode($this->_baseUrl):$this->_baseUrl); } publicfunctionsetBasePath($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; } publicfunctiongetBasePath() { if(null===$this->_basePath){ $this->setBasePath(); } return$this->_basePath; } publicfunctionsetPathInfo($pathInfo=null) { if($pathInfo===null){ $baseUrl=$this->getBaseUrl();//thisactuallycallssetBaseUrl()&setRequestUri() $baseUrlRaw=$this->getBaseUrl(false); $baseUrlEncoded=urlencode($baseUrlRaw); if(null===($requestUri=$this->getRequestUri())){ return$this; } //RemovethequerystringfromREQUEST_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; } publicfunctiongetPathInfo() { if(empty($this->_pathInfo)){ $this->setPathInfo(); } return$this->_pathInfo; } publicfunctionsetParamSources(array$paramSources=array()) { $this->_paramSources=$paramSources; return$this; } publicfunctiongetParamSources() { return$this->_paramSources; } publicfunctionsetParam($key,$value) { $key=(null!==($alias=$this->getAlias($key)))?$alias:$key; parent::setParam($key,$value); return$this; } publicfunctiongetParam($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; } publicfunctiongetParams() { $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; } publicfunctionsetParams(array$params) { foreach($paramsas$key=>$value){ $this->setParam($key,$value); } return$this; } publicfunctionsetAlias($name,$target) { $this->_aliases[$name]=$target; return$this; } publicfunctiongetAlias($name) { if(isset($this->_aliases[$name])){ return$this->_aliases[$name]; } returnnull; } publicfunctiongetAliases() { return$this->_aliases; } publicfunctiongetMethod() { return$this->getServer('REQUEST_METHOD'); } publicfunctionisPost() { if('POST'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisGet() { if('GET'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisPut() { if('PUT'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisDelete() { if('DELETE'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisHead() { if('HEAD'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisOptions() { if('OPTIONS'==$this->getMethod()){ returntrue; } returnfalse; } publicfunctionisXmlHttpRequest() { return($this->getHeader('X_REQUESTED_WITH')=='XMLHttpRequest'); } publicfunctionisFlashRequest() { $header=strtolower($this->getHeader('USER_AGENT')); return(strstr($header,'flash'))?true:false; } publicfunctionisSecure() { return($this->getScheme()===self::SCHEME_HTTPS); } publicfunctiongetRawBody() { 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; } publicfunctiongetHeader($header) { if(empty($header)){ require_once'Zend/Controller/Request/Exception.php'; thrownewZend_Controller_Request_Exception('AnHTTPheadernameisrequired'); } //Trytogetitfromthe$_SERVERarrayfirst $temp='HTTP_'.strtoupper(str_replace('-','_',$header)); if(isset($_SERVER[$temp])){ return$_SERVER[$temp]; } //ThisseemstobetheonlywaytogettheAuthorizationheaderon //Apache if(function_exists('apache_request_headers')){ $headers=apache_request_headers(); if(isset($headers[$header])){ return$headers[$header]; } $header=strtolower($header); foreach($headersas$key=>$value){ if(strtolower($key)==$header){ return$value; } } } returnfalse; } publicfunctiongetScheme() { return($this->getServer('HTTPS')=='on')?self::SCHEME_HTTPS:self::SCHEME_HTTP; } publicfunctiongetHttpHost() { $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; } } publicfunctiongetClientIp($checkProxy=true) { if($checkProxy&&$this->getServer('HTTP_CLIENT_IP')!=null){ $ip=$this->getServer('HTTP_CLIENT_IP'); }elseif($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程序进行精确巧妙的单元测试(unittesting)。
HTTP请求
访问请求数据
Zend_Controller_Request_Http封装了对相关值的访问,如控制器和动作路由器变量的键名和值,从URL解析的附加参数。它还允许访问作为公共成员的超全局变量,管理当前的基地址(BaseURL)和请求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的全体(fullboday)是个例外。
当开发一个RESTfulMVC程序,这个对于接受内容相当有用。
可以在请求对象中使用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处理器来传递请求到前端控制器,或者使用重写规则(rewriterules)的PT标志,URI包含在$_SERVER['REDIRECT_URL'],而不是$_SERVER['REQUEST_URI']。如果使用这样的设定并获取无效的路由,应该使用Zend_Controller_Request_Apache404类代替默认的HTTP类:
$request=newZend_Controller_Request_Apache404(); $front->setRequest($request);
这个类继承了Zend_Controller_Request_Http,并简单的修改了请求URI的自动发现(autodiscovery),它可以用来作为简易替换器件(drop-inreplacement)。
基地址和子目录
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设置最容易,它将导入基地址到请求对象。定制基地址的用法举例:
/** *DispatchRequestwithcustombaseURLwithZend_Controller_Front. */ $router=newZend_Controller_Router_Rewrite(); $controller=Zend_Controller_Front::getInstance(); $controller->setControllerDirectory('./application/controllers') ->setRouter($router) ->setBaseUrl('/projects/myapp');//setthebaseurl! $response=$controller->dispatch();
判断请求方式
getMethod()允许你决定用于请求当前资源的HTTP请求方法。另外,当询问是否一个请求的特定类型是否已经存在,有许多方法允许你获得布尔响应:
isGet()
isPost()
isPut()
isDelete()
isHead()
isOptions()
这些基本用例是来创建RESTfulMVC架构的。
AJAX请求
Zend_Controller_Request_Http有一个初步的方法用来检测AJAX请求:isXmlHttpRequest()。这个方法寻找一个带有'XMLHttpRequest'值的HTTP请求头X-Requested-With;如果发现,就返回true。
当前,这个头用下列JS库缺省地传递:
Prototype/Scriptaculous(andlibrariesderivedfromPrototype)
Yahoo!UILibrary
jQuery
MochiKit
大多数AJAX库允许发送定制的HTTP请求头;如果你的库没有发送这个头,简单地把它作为一个请求头添加上确保isXmlHttpRequest()方法工作。
子类化请求对象。
请求对象是请求环境的容器。控制器链实际上只需要知道如何设置和获取控制器、动作,可选的参数以及分发的状态。默认的,请求将使用controller和action键查询自己的参数来确定控制器和动作。
需要一个请求类来与特定的环境交互以获得需要的数据时,可以扩展该基类或它的衍生类。例如HTTP环境,CLI环境,或者PHP-GTK环境。
更多关于zend相关内容感兴趣的读者可查看本站专题:《ZendFrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。