当前位置:首页 > CMS教程 > 其它CMS > 列表

YII Framework学习之request与response用法(基于CHttpRequest响应)

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-24 08:13:18 浏览: 评论:0 

这篇文章主要介绍了YII Framework学习之request与response用法,详细介绍了CHttpRequest响应request与response的使用技巧,需要的朋友可以参考下

本文实例讲述了YII Framework学习之request与response用法,分享给大家供大家参考,具体如下:

YII中提供了CHttpRequest,封装了请求常用的方法,具体代码如下:

  1. class CHttpRequest extends CApplicationComponent 
  2.   public $enableCookieValidation=false; 
  3.   public $enableCsrfValidation=false; 
  4.   public $csrfTokenName='YII_CSRF_TOKEN'
  5.   public $csrfCookie
  6.   private $_requestUri
  7.   private $_pathInfo
  8.   private $_scriptFile
  9.   private $_scriptUrl
  10.   private $_hostInfo
  11.   private $_baseUrl
  12.   private $_cookies
  13.   private $_preferredLanguage
  14.   private $_csrfToken
  15.   private $_deleteParams
  16.   private $_putParams
  17.   public function init() 
  18.   { 
  19.     parent::init(); 
  20.     $this->normalizeRequest(); 
  21.   } 
  22.   protected function normalizeRequest() 
  23.   { 
  24.     // normalize request 
  25.     if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
  26.     { 
  27.       if(isset($_GET)) 
  28.         $_GET=$this->stripSlashes($_GET); 
  29.       if(isset($_POST)) 
  30.         $_POST=$this->stripSlashes($_POST); 
  31.       if(isset($_REQUEST)) 
  32.         $_REQUEST=$this->stripSlashes($_REQUEST); 
  33.       if(isset($_COOKIE)) 
  34.         $_COOKIE=$this->stripSlashes($_COOKIE); 
  35.     } 
  36.     if($this->enableCsrfValidation) 
  37.       Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken')); 
  38.   } 
  39.   public function stripSlashes(&$data
  40.   { 
  41.     return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data); 
  42.   } 
  43.   public function getParam($name,$defaultValue=null) 
  44.   { 
  45.     return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $defaultValue); 
  46.   } 
  47.   public function getQuery($name,$defaultValue=null) 
  48.   { 
  49.     return isset($_GET[$name]) ? $_GET[$name] : $defaultValue
  50.   } 
  51.   public function getPost($name,$defaultValue=null) 
  52.   { 
  53.     return isset($_POST[$name]) ? $_POST[$name] : $defaultValue
  54.   } 
  55.   public function getDelete($name,$defaultValue=null) 
  56.   { 
  57.     if($this->_deleteParams===null) 
  58.       $this->_deleteParams=$this->getIsDeleteRequest() ? $this->getRestParams() : array(); 
  59.     return isset($this->_deleteParams[$name]) ? $this->_deleteParams[$name] : $defaultValue
  60.   } 
  61.   public function getPut($name,$defaultValue=null) 
  62.   { 
  63.     if($this->_putParams===null) 
  64.       $this->_putParams=$this->getIsPutRequest() ? $this->getRestParams() : array(); 
  65.     return isset($this->_putParams[$name]) ? $this->_putParams[$name] : $defaultValue
  66.   } 
  67.   protected function getRestParams() 
  68.   { 
  69.     $result=array(); 
  70.     if(function_exists('mb_parse_str')) 
  71.       mb_parse_str(file_get_contents('php://input'), $result); 
  72.     else 
  73.       parse_str(file_get_contents('php://input'), $result); 
  74.     return $result
  75.   } 
  76.   public function getUrl() 
  77.   { 
  78.     return $this->getRequestUri(); 
  79.   } 
  80.   public function getHostInfo($schema=''
  81.   { 
  82.     if($this->_hostInfo===null) 
  83.     { 
  84.       if($secure=$this->getIsSecureConnection()) 
  85.         $http='https'
  86.       else 
  87.         $http='http'
  88.       if(isset($_SERVER['HTTP_HOST'])) 
  89.         $this->_hostInfo=$http.'://'.$_SERVER['HTTP_HOST']; 
  90.       else 
  91.       { 
  92.         $this->_hostInfo=$http.'://'.$_SERVER['SERVER_NAME']; 
  93.         $port=$secure ? $this->getSecurePort() : $this->getPort(); 
  94.         if(($port!==80 && !$secure) || ($port!==443 && $secure)) 
  95.           $this->_hostInfo.=':'.$port
  96.       } 
  97.     } 
  98.     if($schema!==''
  99.     { 
  100.       $secure=$this->getIsSecureConnection(); 
  101.       if($secure && $schema==='https' || !$secure && $schema==='http'
  102.         return $this->_hostInfo; 
  103.       $port=$schema==='https' ? $this->getSecurePort() : $this->getPort(); 
  104.       if($port!==80 && $schema==='http' || $port!==443 && $schema==='https'
  105.         $port=':'.$port
  106.       else 
  107.         $port=''
  108.       $pos=strpos($this->_hostInfo,':'); 
  109.       return $schema.substr($this->_hostInfo,$pos,strcspn($this->_hostInfo,':',$pos+1)+1).$port
  110.     } 
  111.     else 
  112.       return $this->_hostInfo; 
  113.   } 
  114.   public function setHostInfo($value
  115.   { 
  116.     $this->_hostInfo=rtrim($value,'/'); 
  117.   } 
  118.   public function getBaseUrl($absolute=false) 
  119.   { 
  120.     if($this->_baseUrl===null) 
  121.       $this->_baseUrl=rtrim(dirname($this->getScriptUrl()),'\\/'); 
  122.     return $absolute ? $this->getHostInfo() . $this->_baseUrl : $this->_baseUrl; 
  123.   } 
  124.   public function setBaseUrl($value
  125.   { 
  126.     $this->_baseUrl=$value
  127.   } 
  128.   public function getScriptUrl() 
  129.   { 
  130.     if($this->_scriptUrl===null) 
  131.     { 
  132.       $scriptName=basename($_SERVER['SCRIPT_FILENAME']); 
  133.       if(basename($_SERVER['SCRIPT_NAME'])===$scriptName
  134.         $this->_scriptUrl=$_SERVER['SCRIPT_NAME']; 
  135.       else if(basename($_SERVER['PHP_SELF'])===$scriptName
  136.         $this->_scriptUrl=$_SERVER['PHP_SELF']; 
  137.       else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName
  138.         $this->_scriptUrl=$_SERVER['ORIG_SCRIPT_NAME']; 
  139.       else if(($pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false) 
  140.         $this->_scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName
  141.       else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0) 
  142.         $this->_scriptUrl=str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME'])); 
  143.       else 
  144.         throw new CException(Yii::t('yii','CHttpRequest is unable to determine the entry script URL.')); 
  145.     } 
  146.     return $this->_scriptUrl; 
  147.   } 
  148.   public function setScriptUrl($value
  149.   { 
  150.     $this->_scriptUrl='/'.trim($value,'/'); 
  151.   } 
  152.   public function getPathInfo() 
  153.   { 
  154.     if($this->_pathInfo===null) 
  155.     { 
  156.       $pathInfo=$this->getRequestUri(); 
  157.       if(($pos=strpos($pathInfo,'?'))!==false) 
  158.         $pathInfo=substr($pathInfo,0,$pos); 
  159.       $pathInfo=urldecode($pathInfo); 
  160.       $scriptUrl=$this->getScriptUrl(); 
  161.       $baseUrl=$this->getBaseUrl(); 
  162.       if(strpos($pathInfo,$scriptUrl)===0) 
  163.         $pathInfo=substr($pathInfo,strlen($scriptUrl)); 
  164.       else if($baseUrl==='' || strpos($pathInfo,$baseUrl)===0) 
  165.         $pathInfo=substr($pathInfo,strlen($baseUrl)); 
  166.       else if(strpos($_SERVER['PHP_SELF'],$scriptUrl)===0) 
  167.         $pathInfo=substr($_SERVER['PHP_SELF'],strlen($scriptUrl)); 
  168.       else 
  169.         throw new CException(Yii::t('yii','CHttpRequest is unable to determine the path info of the request.')); 
  170.       $this->_pathInfo=trim($pathInfo,'/'); 
  171.     } 
  172.     return $this->_pathInfo; 
  173.   } 
  174.   public function getRequestUri() 
  175.   { 
  176.     if($this->_requestUri===null) 
  177.     { 
  178.       if(isset($_SERVER['HTTP_X_REWRITE_URL'])) // IIS 
  179.         $this->_requestUri=$_SERVER['HTTP_X_REWRITE_URL']; 
  180.       else if(isset($_SERVER['REQUEST_URI'])) 
  181.       { 
  182.         $this->_requestUri=$_SERVER['REQUEST_URI']; 
  183.         if(isset($_SERVER['HTTP_HOST'])) 
  184.         { 
  185.           if(strpos($this->_requestUri,$_SERVER['HTTP_HOST'])!==false) 
  186.             $this->_requestUri=preg_replace('/^\w+:\/\/[^\/]+/','',$this->_requestUri); 
  187.         } 
  188.         else 
  189.           $this->_requestUri=preg_replace('/^(http|https):\/\/[^\/]+/i','',$this->_requestUri); 
  190.       } 
  191.       else if(isset($_SERVER['ORIG_PATH_INFO'])) // IIS 5.0 CGI 
  192.       { 
  193.         $this->_requestUri=$_SERVER['ORIG_PATH_INFO']; 
  194.         if(!emptyempty($_SERVER['QUERY_STRING'])) 
  195.           $this->_requestUri.='?'.$_SERVER['QUERY_STRING']; 
  196.       } 
  197.       else 
  198.         throw new CException(Yii::t('yii','CHttpRequest is unable to determine the request URI.')); 
  199.     } 
  200.     return $this->_requestUri; 
  201.   } 
  202.   public function getQueryString() 
  203.   { 
  204.     return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:''
  205.   } 
  206.   public function getIsSecureConnection() 
  207.   { 
  208.     return isset($_SERVER['HTTPS']) && !strcasecmp($_SERVER['HTTPS'],'on'); 
  209.   } 
  210.   public function getRequestType() 
  211.   { 
  212.     return strtoupper(isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:'GET'); 
  213.   } 
  214.   public function getIsPostRequest() 
  215.   { 
  216.     return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'POST'); 
  217.   } 
  218.   public function getIsDeleteRequest() 
  219.   { 
  220.     return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'DELETE'); 
  221.   } 
  222.   public function getIsPutRequest() 
  223.   { 
  224.     return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'PUT'); 
  225.   } 
  226.   public function getIsAjaxRequest() 
  227.   { 
  228.     return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest'
  229.   } 
  230.   public function getServerName() 
  231.   { 
  232.     return $_SERVER['SERVER_NAME']; 
  233.   } 
  234.   public function getServerPort() 
  235.   { 
  236.     return $_SERVER['SERVER_PORT']; 
  237.   } 
  238.   public function getUrlReferrer() 
  239.   { 
  240.     return isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:null; 
  241.   } 
  242.   public function getUserAgent() 
  243.   { 
  244.     return isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:null; 
  245.   } 
  246.   public function getUserHostAddress() 
  247.   { 
  248.     return isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'127.0.0.1'
  249.   } 
  250.   public function getUserHost() 
  251.   { 
  252.     return isset($_SERVER['REMOTE_HOST'])?$_SERVER['REMOTE_HOST']:null; 
  253.   } 
  254.   public function getScriptFile() 
  255.   { 
  256.     if($this->_scriptFile!==null) 
  257.       return $this->_scriptFile; 
  258.     else 
  259.       return $this->_scriptFile=realpath($_SERVER['SCRIPT_FILENAME']); 
  260.   } 
  261.   public function getBrowser($userAgent=null) 
  262.   { 
  263.     return get_browser($userAgent,true); 
  264.   } 
  265.   public function getAcceptTypes() 
  266.   { 
  267.     return isset($_SERVER['HTTP_ACCEPT'])?$_SERVER['HTTP_ACCEPT']:null; 
  268.   } 
  269.   private $_port
  270.   public function getPort() 
  271.   { 
  272.     if($this->_port===null) 
  273.       $this->_port=!$this->getIsSecureConnection() && isset($_SERVER['SERVER_PORT']) ? (int)$_SERVER['SERVER_PORT'] : 80; 
  274.     return $this->_port; 
  275.   } 
  276.   public function setPort($value
  277.   { 
  278.     $this->_port=(int)$value
  279.     $this->_hostInfo=null; 
  280.   } 
  281.   private $_securePort
  282.   public function getSecurePort() 
  283.   { 
  284.     if($this->_securePort===null) 
  285.       $this->_securePort=$this->getIsSecureConnection() && isset($_SERVER['SERVER_PORT']) ? (int)$_SERVER['SERVER_PORT'] : 443; 
  286.     return $this->_securePort; 
  287.   } 
  288.   public function setSecurePort($value
  289.   { 
  290.     $this->_securePort=(int)$value
  291.     $this->_hostInfo=null; 
  292.   } 
  293.   public function getCookies() 
  294.   { 
  295.     if($this->_cookies!==null) 
  296.       return $this->_cookies; 
  297.     else 
  298.       return $this->_cookies=new CCookieCollection($this); 
  299.   } 
  300.   public function redirect($url,$terminate=true,$statusCode=302) 
  301.   { 
  302.     if(strpos($url,'/')===0) 
  303.       $url=$this->getHostInfo().$url
  304.     header('Location: '.$url, true, $statusCode); 
  305.     if($terminate
  306.       Yii::app()->end(); 
  307.   } 
  308.   public function getPreferredLanguage() 
  309.   { 
  310.     if($this->_preferredLanguage===null) 
  311.     { 
  312.       if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && ($n=preg_match_all('/([\w\-_]+)\s*(;\s*q\s*=\s*(\d*\.\d*))?/',$_SERVER['HTTP_ACCEPT_LANGUAGE'],$matches))>0) 
  313.       { 
  314.         $languages=array(); 
  315.         for($i=0;$i<$n;++$i
  316.           $languages[$matches[1][$i]]=emptyempty($matches[3][$i]) ? 1.0 : floatval($matches[3][$i]); 
  317.         arsort($languages); 
  318.         foreach($languages as $language=>$pref
  319.           return $this->_preferredLanguage=CLocale::getCanonicalID($language); 
  320.       } 
  321.       return $this->_preferredLanguage=false; 
  322.     } 
  323.     return $this->_preferredLanguage; 
  324.   } 
  325.   public function sendFile($fileName,$content,$mimeType=null,$terminate=true) 
  326.   { 
  327.     if($mimeType===null) 
  328.     { 
  329.       if(($mimeType=CFileHelper::getMimeTypeByExtension($fileName))===null) 
  330.         $mimeType='text/plain'
  331.     } 
  332.     header('Pragma: public'); 
  333.     header('Expires: 0'); 
  334.     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
  335.     header("Content-type: $mimeType"); 
  336.     if(ini_get("output_handler")==''
  337.       header('Content-Length: '.(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content))); 
  338.     header("Content-Disposition: attachment; filename=\"$fileName\""); 
  339.     header('Content-Transfer-Encoding: binary'); 
  340.     if($terminate
  341.     { 
  342.       // clean up the application first because the file downloading could take long time 
  343.       // which may cause timeout of some resources (such as DB connection) 
  344.       Yii::app()->end(0,false); 
  345.       echo $content
  346.       exit(0); 
  347.     } 
  348.     else 
  349.       echo $content
  350.   } 
  351.   public function xSendFile($filePath$options=array()) 
  352.   { 
  353.     if(!is_file($filePath)) 
  354.       return false; 
  355.     if(!isset($options['saveName'])) 
  356.       $options['saveName']=basename($filePath); 
  357.     if(!isset($options['mimeType'])) 
  358.     { 
  359.       if(($options['mimeType']=CFileHelper::getMimeTypeByExtension($filePath))===null) 
  360.         $options['mimeType']='text/plain'
  361.     } 
  362.     if(!isset($options['xHeader'])) 
  363.       $options['xHeader']='X-Sendfile'
  364.     header('Content-type: '.$options['mimeType']); 
  365.     header('Content-Disposition: attachment; filename="'.$options['saveName'].'"'); 
  366.     header(trim($options['xHeader']).': '.$filePath); 
  367.     if(!isset($options['terminate']) || $options['terminate']) 
  368.       Yii::app()->end(); 
  369.     return true; 
  370.   } 
  371.   public function getCsrfToken() 
  372.   { 
  373.     if($this->_csrfToken===null) 
  374.     { 
  375.       $cookie=$this->getCookies()->itemAt($this->csrfTokenName); 
  376.       if(!$cookie || ($this->_csrfToken=$cookie->value)==null) 
  377.       { 
  378.         $cookie=$this->createCsrfCookie(); 
  379.         $this->_csrfToken=$cookie->value; 
  380.         $this->getCookies()->add($cookie->name,$cookie); 
  381.       } 
  382.     } 
  383.     return $this->_csrfToken; 
  384.   } 
  385.   protected function createCsrfCookie() 
  386.   { 
  387.     $cookie=new CHttpCookie($this->csrfTokenName,sha1(uniqid(mt_rand(),true))); 
  388.     if(is_array($this->csrfCookie)) 
  389.     { 
  390.       foreach($this->csrfCookie as $name=>$value
  391.         $cookie->$name=$value
  392.     } 
  393.     return $cookie
  394.   } 
  395.   public function validateCsrfToken($event
  396.   { 
  397.     if($this->getIsPostRequest()) 
  398.     { 
  399.       // only validate POST requests 
  400.       $cookies=$this->getCookies(); 
  401.       if($cookies->contains($this->csrfTokenName) && isset($_POST[$this->csrfTokenName])) 
  402.       { 
  403.         $tokenFromCookie=$cookies->itemAt($this->csrfTokenName)->value; 
  404.         $tokenFromPost=$_POST[$this->csrfTokenName]; 
  405.         $valid=$tokenFromCookie===$tokenFromPost
  406.       } 
  407.       else 
  408.         $valid=false; 
  409.       if(!$valid
  410.         throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.')); 
  411.     } 
  412.   } 

request操作的相关方法,一目了然。

  1. public function init() 
  2.   parent::init(); 
  3.   $this->normalizeRequest(); 
  4. protected function normalizeRequest() 
  5.   // normalize request 
  6.   if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) 
  7.   { 
  8.     if(isset($_GET)) 
  9.       $_GET=$this->stripSlashes($_GET); 
  10.     if(isset($_POST)) 
  11.       $_POST=$this->stripSlashes($_POST); 
  12.     if(isset($_REQUEST)) 
  13.       $_REQUEST=$this->stripSlashes($_REQUEST); 
  14.     if(isset($_COOKIE)) 
  15.       $_COOKIE=$this->stripSlashes($_COOKIE); 
  16.   } 
  17.   if($this->enableCsrfValidation) 
  18.     Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken')); 
  19. public function stripSlashes(&$data
  20.   return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data); 

可以看到yii对$_GET\$_POST\$_REQUEST\$_COOKIE进行了必要的过滤处理,所以可以放心的使用数据。

常用的有如下方法:

获取get参数

public function getParam($name,$defaultValue=null)

获取get参数

public function getQuery($name,$defaultValue=null)

获取post数据

public function getPost($name,$defaultValue=null)

获取请求的url

public function getUrl()

获取主机信息

public function getHostInfo($schema='')

设置

public function setHostInfo($value)

获取根目录

public function getBaseUrl($absolute=false)

获取当前url

public function getScriptUrl()

获取请求的url

public function getRequestUri()

获取querystring

public function getQueryString()

判断是否是https

public function getIsSecureConnection()

获取请求类型

public function getRequestType()

是否是post请求

public function getIsPostRequest()

是否是ajax请求

public function getIsAjaxRequest()

获取服务器名称

public function getServerName()

获取服务端口

public function getServerPort()

获取引用路径

public function getUrlReferrer()

获取用户ip地址

public function getUserHostAddress()

获取用户主机名称

public function getUserHost()

获取执行脚本名称

public function getScriptFile()

获取cookie

public function getCookies()

重定向

public function redirect($url,$terminate=true,$statusCode=302)

设置下载文件头

  1. public function sendFile($fileName,$content,$mimeType=null,$terminate=true) 
  2. if($mimeType===null) 
  3. if(($mimeType=CFileHelper::getMimeTypeByExtension($fileName))===null) 
  4. $mimeType='text/plain'
  5. header('Pragma: public'); 
  6. header('Expires: 0'); 
  7. header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
  8. header("Content-type: $mimeType"); 
  9. if(ini_get("output_handler")==''
  10. header('Content-Length: '.(function_exists('mb_strlen') ? mb_strlen($content,'8bit') : strlen($content))); 
  11. header("Content-Disposition: attachment; filename=\"$fileName\""); 
  12. header('Content-Transfer-Encoding: binary'); 
  13. if($terminate
  14. // clean up the application first because the file downloading could take long time 
  15. // which may cause timeout of some resources (such as DB connection) 
  16. Yii::app()->end(0,false); 
  17. echo $content
  18. exit(0); 
  19. else 
  20. echo $content
  21. public function xSendFile($filePath$options=array()) 
  22. if(!is_file($filePath)) 
  23. return false; 
  24. if(!isset($options['saveName'])) 
  25. $options['saveName']=basename($filePath); 
  26. if(!isset($options['mimeType'])) 
  27. if(($options['mimeType']=CFileHelper::getMimeTypeByExtension($filePath))===null) 
  28. $options['mimeType']='text/plain'
  29. if(!isset($options['xHeader'])) 
  30. $options['xHeader']='X-Sendfile'
  31. header('Content-type: '.$options['mimeType']); 
  32. header('Content-Disposition: attachment; filename="'.$options['saveName'].'"'); 
  33. header(trim($options['xHeader']).': '.$filePath); 
  34. if(!isset($options['terminate']) || $options['terminate']) 
  35. Yii::app()->end(); 
  36. return true; 

为了防止csrf,yii提供了相应的方法

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

  1. public function getCsrfToken() 
  2. if($this->_csrfToken===null) 
  3. $cookie=$this->getCookies()->itemAt($this->csrfTokenName); 
  4. if(!$cookie || ($this->_csrfToken=$cookie->value)==null) 
  5. $cookie=$this->createCsrfCookie(); 
  6. $this->_csrfToken=$cookie->value; 
  7. $this->getCookies()->add($cookie->name,$cookie); 
  8. return $this->_csrfToken; 
  9. protected function createCsrfCookie() 
  10. $cookie=new CHttpCookie($this->csrfTokenName,sha1(uniqid(mt_rand(),true))); 
  11. if(is_array($this->csrfCookie)) 
  12. foreach($this->csrfCookie as $name=>$value
  13. $cookie->$name=$value
  14. return $cookie
  15. public function validateCsrfToken($event
  16. if($this->getIsPostRequest()) 
  17. // only validate POST requests 
  18. $cookies=$this->getCookies(); 
  19. if($cookies->contains($this->csrfTokenName) && isset($_POST[$this->csrfTokenName])) 
  20. $tokenFromCookie=$cookies->itemAt($this->csrfTokenName)->value; 
  21. $tokenFromPost=$_POST[$this->csrfTokenName]; 
  22. $valid=$tokenFromCookie===$tokenFromPost
  23. else 
  24. $valid=false; 
  25. if(!$valid
  26. throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.')); 

对于$_GET的使用,不仅仅可以使用$_GET和以上提供的相关方法,在action中,可以绑定到action的方法参数。

http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller

这里就一并罗列官方给出的说明。

从版本 1.1.4 开始,Yii 提供了对自动动作参数绑定的支持,就是说,控制器动作可以定义命名的参数,参数的值将由 Yii 自动从 $_GET 填充。

为了详细说明此功能,假设我们需要为 PostController 写一个 create 动作。此动作需要两个参数:

category: 一个整数,代表帖子(post)要发表在的那个分类的ID。

language: 一个字符串,代表帖子所使用的语言代码。

从 $_GET 中提取参数时,我们可以不再下面这种无聊的代码了:

  1. class PostController extends CController 
  2.   public function actionCreate() 
  3.   { 
  4.     if(isset($_GET['category'])) 
  5.       $category=(int)$_GET['category']; 
  6.     else 
  7.       throw new CHttpException(404,'invalid request'); 
  8.     if(isset($_GET['language'])) 
  9.       $language=$_GET['language']; 
  10.     else 
  11.       $language='en'
  12.     // ... fun code starts here ... 
  13.   } 

现在使用动作参数功能,我们可以更轻松的完成任务:

  1. class PostController extends CController 
  2.   public function actionCreate($category$language='en'
  3.   { 
  4.     $category=(int)$category
  5.     // ... fun code starts here ... 
  6.   } 

注意我们在动作方法 actionCreate 中添加了两个参数,这些参数的名字必须和我们想要从 $_GET 中提取的名字一致,当用户没有在请求中指定 $language 参数时,这个参数会使用默认值 en,由于 $category 没有默认值,如果用户没有在 $_GET 中提供 category 参数, 将会自动抛出一个 CHttpException (错误代码 400) 异常,Starting from version 1.1.5, Yii also supports array type detection for action parameters. This is done by PHP type hinting using the syntax like the following:

  1. class PostController extends CController 
  2.   public function actionCreate(array $categories
  3.   { 
  4.     // Yii will make sure $categories be an array 
  5.   } 

That is, we add the keyword array in front of $categories in the method parameter declaration. By doing so, if $_GET['categories'] is a simple string, it will be converted into an array consisting of that string.

Note: If a parameter is declared without the array type hint, it means the parameter must be a scalar (i.e., not an array). In this case, passing in an array parameter via $_GET would cause an HTTP exception.

request的使用你只要保持和以前在php中的使用方式一样,在yii中是不会出错的

Tags: request response CHttpRequest

分享到: