首页 > 后端开发 > php教程 > YII Framework学习之request与response用法(基于CHttpRequest响应),yiichttprequest_PHP教程

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-07-12 08:55:17
原创
951 人浏览过

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

class CHttpRequest extends CApplicationComponent

{

  public $enableCookieValidation=false;

  public $enableCsrfValidation=false;

  public $csrfTokenName='YII_CSRF_TOKEN';

  public $csrfCookie;

  private $_requestUri;

  private $_pathInfo;

  private $_scriptFile;

  private $_scriptUrl;

  private $_hostInfo;

  private $_baseUrl;

  private $_cookies;

  private $_preferredLanguage;

  private $_csrfToken;

  private $_deleteParams;

  private $_putParams;

  public function init()

  {

    parent::init();

    $this->normalizeRequest();

  }

  protected function normalizeRequest()

  {

    // normalize request

    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())

    {

      if(isset($_GET))

        $_GET=$this->stripSlashes($_GET);

      if(isset($_POST))

        $_POST=$this->stripSlashes($_POST);

      if(isset($_REQUEST))

        $_REQUEST=$this->stripSlashes($_REQUEST);

      if(isset($_COOKIE))

        $_COOKIE=$this->stripSlashes($_COOKIE);

    }

    if($this->enableCsrfValidation)

      Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));

  }

  public function stripSlashes(&$data)

  {

    return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data);

  }

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

  {

    return isset($_GET[$name]) ? $_GET[$name] : (isset($_POST[$name]) ? $_POST[$name] : $defaultValue);

  }

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

  {

    return isset($_GET[$name]) ? $_GET[$name] : $defaultValue;

  }

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

  {

    return isset($_POST[$name]) ? $_POST[$name] : $defaultValue;

  }

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

  {

    if($this->_deleteParams===null)

      $this->_deleteParams=$this->getIsDeleteRequest() ? $this->getRestParams() : array();

    return isset($this->_deleteParams[$name]) ? $this->_deleteParams[$name] : $defaultValue;

  }

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

  {

    if($this->_putParams===null)

      $this->_putParams=$this->getIsPutRequest() ? $this->getRestParams() : array();

    return isset($this->_putParams[$name]) ? $this->_putParams[$name] : $defaultValue;

  }

  protected function getRestParams()

  {

    $result=array();

    if(function_exists('mb_parse_str'))

      mb_parse_str(file_get_contents('php://input'), $result);

    else

      parse_str(file_get_contents('php://input'), $result);

    return $result;

  }

  public function getUrl()

  {

    return $this->getRequestUri();

  }

  public function getHostInfo($schema='')

  {

    if($this->_hostInfo===null)

    {

      if($secure=$this->getIsSecureConnection())

        $http='https';

      else

        $http='http';

      if(isset($_SERVER['HTTP_HOST']))

        $this->_hostInfo=$http.'://'.$_SERVER['HTTP_HOST'];

      else

      {

        $this->_hostInfo=$http.'://'.$_SERVER['SERVER_NAME'];

        $port=$secure ? $this->getSecurePort() : $this->getPort();

        if(($port!==80 && !$secure) || ($port!==443 && $secure))

          $this->_hostInfo.=':'.$port;

      }

    }

    if($schema!=='')

    {

      $secure=$this->getIsSecureConnection();

      if($secure && $schema==='https' || !$secure && $schema==='http')

        return $this->_hostInfo;

      $port=$schema==='https' ? $this->getSecurePort() : $this->getPort();

      if($port!==80 && $schema==='http' || $port!==443 && $schema==='https')

        $port=':'.$port;

      else

        $port='';

      $pos=strpos($this->_hostInfo,':');

      return $schema.substr($this->_hostInfo,$pos,strcspn($this->_hostInfo,':',$pos+1)+1).$port;

    }

    else

      return $this->_hostInfo;

  }

  public function setHostInfo($value)

  {

    $this->_hostInfo=rtrim($value,'/');

  }

  public function getBaseUrl($absolute=false)

  {

    if($this->_baseUrl===null)

      $this->_baseUrl=rtrim(dirname($this->getScriptUrl()),'\\/');

    return $absolute ? $this->getHostInfo() . $this->_baseUrl : $this->_baseUrl;

  }

  public function setBaseUrl($value)

  {

    $this->_baseUrl=$value;

  }

  public function getScriptUrl()

  {

    if($this->_scriptUrl===null)

    {

      $scriptName=basename($_SERVER['SCRIPT_FILENAME']);

      if(basename($_SERVER['SCRIPT_NAME'])===$scriptName)

        $this->_scriptUrl=$_SERVER['SCRIPT_NAME'];

      else if(basename($_SERVER['PHP_SELF'])===$scriptName)

        $this->_scriptUrl=$_SERVER['PHP_SELF'];

      else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME'])===$scriptName)

        $this->_scriptUrl=$_SERVER['ORIG_SCRIPT_NAME'];

      else if(($pos=strpos($_SERVER['PHP_SELF'],'/'.$scriptName))!==false)

        $this->_scriptUrl=substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;

      else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===0)

        $this->_scriptUrl=str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));

      else

        throw new CException(Yii::t('yii','CHttpRequest is unable to determine the entry script URL.'));

    }

    return $this->_scriptUrl;

  }

  public function setScriptUrl($value)

  {

    $this->_scriptUrl='/'.trim($value,'/');

  }

  public function getPathInfo()

  {

    if($this->_pathInfo===null)

    {

      $pathInfo=$this->getRequestUri();

      if(($pos=strpos($pathInfo,'?'))!==false)

        $pathInfo=substr($pathInfo,0,$pos);

      $pathInfo=urldecode($pathInfo);

      $scriptUrl=$this->getScriptUrl();

      $baseUrl=$this->getBaseUrl();

      if(strpos($pathInfo,$scriptUrl)===0)

        $pathInfo=substr($pathInfo,strlen($scriptUrl));

      else if($baseUrl==='' || strpos($pathInfo,$baseUrl)===0)

        $pathInfo=substr($pathInfo,strlen($baseUrl));

      else if(strpos($_SERVER['PHP_SELF'],$scriptUrl)===0)

        $pathInfo=substr($_SERVER['PHP_SELF'],strlen($scriptUrl));

      else

        throw new CException(Yii::t('yii','CHttpRequest is unable to determine the path info of the request.'));

      $this->_pathInfo=trim($pathInfo,'/');

    }

    return $this->_pathInfo;

  }

  public function getRequestUri()

  {

    if($this->_requestUri===null)

    {

      if(isset($_SERVER['HTTP_X_REWRITE_URL'])) // IIS

        $this->_requestUri=$_SERVER['HTTP_X_REWRITE_URL'];

      else if(isset($_SERVER['REQUEST_URI']))

      {

        $this->_requestUri=$_SERVER['REQUEST_URI'];

        if(isset($_SERVER['HTTP_HOST']))

        {

          if(strpos($this->_requestUri,$_SERVER['HTTP_HOST'])!==false)

            $this->_requestUri=preg_replace('/^\w+:\/\/[^\/]+/','',$this->_requestUri);

        }

        else

          $this->_requestUri=preg_replace('/^(http|https):\/\/[^\/]+/i','',$this->_requestUri);

      }

      else if(isset($_SERVER['ORIG_PATH_INFO'])) // IIS 5.0 CGI

      {

        $this->_requestUri=$_SERVER['ORIG_PATH_INFO'];

        if(!empty($_SERVER['QUERY_STRING']))

          $this->_requestUri.='?'.$_SERVER['QUERY_STRING'];

      }

      else

        throw new CException(Yii::t('yii','CHttpRequest is unable to determine the request URI.'));

    }

    return $this->_requestUri;

  }

  public function getQueryString()

  {

    return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:'';

  }

  public function getIsSecureConnection()

  {

    return isset($_SERVER['HTTPS']) && !strcasecmp($_SERVER['HTTPS'],'on');

  }

  public function getRequestType()

  {

    return strtoupper(isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:'GET');

  }

  public function getIsPostRequest()

  {

    return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'POST');

  }

  public function getIsDeleteRequest()

  {

    return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'DELETE');

  }

  public function getIsPutRequest()

  {

    return isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'PUT');

  }

  public function getIsAjaxRequest()

  {

    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';

  }

  public function getServerName()

  {

    return $_SERVER['SERVER_NAME'];

  }

  public function getServerPort()

  {

    return $_SERVER['SERVER_PORT'];

  }

  public function getUrlReferrer()

  {

    return isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:null;

  }

  public function getUserAgent()

  {

    return isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:null;

  }

  public function getUserHostAddress()

  {

    return isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'127.0.0.1';

  }

  public function getUserHost()

  {

    return isset($_SERVER['REMOTE_HOST'])?$_SERVER['REMOTE_HOST']:null;

  }

  public function getScriptFile()

  {

    if($this->_scriptFile!==null)

      return $this->_scriptFile;

    else

      return $this->_scriptFile=realpath($_SERVER['SCRIPT_FILENAME']);

  }

  public function getBrowser($userAgent=null)

  {

    return get_browser($userAgent,true);

  }

  public function getAcceptTypes()

  {

    return isset($_SERVER['HTTP_ACCEPT'])?$_SERVER['HTTP_ACCEPT']:null;

  }

  private $_port;

  public function getPort()

  {

    if($this->_port===null)

      $this->_port=!$this->getIsSecureConnection() && isset($_SERVER['SERVER_PORT']) ? (int)$_SERVER['SERVER_PORT'] : 80;

    return $this->_port;

  }

  public function setPort($value)

  {

    $this->_port=(int)$value;

    $this->_hostInfo=null;

  }

  private $_securePort;

  public function getSecurePort()

  {

    if($this->_securePort===null)

      $this->_securePort=$this->getIsSecureConnection() && isset($_SERVER['SERVER_PORT']) ? (int)$_SERVER['SERVER_PORT'] : 443;

    return $this->_securePort;

  }

  public function setSecurePort($value)

  {

    $this->_securePort=(int)$value;

    $this->_hostInfo=null;

  }

  public function getCookies()

  {

    if($this->_cookies!==null)

      return $this->_cookies;

    else

      return $this->_cookies=new CCookieCollection($this);

  }

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

  {

    if(strpos($url,'/')===0)

      $url=$this->getHostInfo().$url;

    header('Location: '.$url, true, $statusCode);

    if($terminate)

      Yii::app()->end();

  }

  public function getPreferredLanguage()

  {

    if($this->_preferredLanguage===null)

    {

      if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && ($n=preg_match_all('/([\w\-_]+)\s*(;\s*q\s*=\s*(\d*\.\d*))?/',$_SERVER['HTTP_ACCEPT_LANGUAGE'],$matches))>0)

      {

        $languages=array();

        for($i=0;$i<$n;++$i)

          $languages[$matches[1][$i]]=empty($matches[3][$i]) &#63; 1.0 : floatval($matches[3][$i]);

        arsort($languages);

        foreach($languages as $language=>$pref)

          return $this->_preferredLanguage=CLocale::getCanonicalID($language);

      }

      return $this->_preferredLanguage=false;

    }

    return $this->_preferredLanguage;

  }

  public function sendFile($fileName,$content,$mimeType=null,$terminate=true)

  {

    if($mimeType===null)

    {

      if(($mimeType=CFileHelper::getMimeTypeByExtension($fileName))===null)

        $mimeType='text/plain';

    }

    header('Pragma: public');

    header('Expires: 0');

    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

    header("Content-type: $mimeType");

    if(ini_get("output_handler")=='')

      header('Content-Length: '.(function_exists('mb_strlen') &#63; mb_strlen($content,'8bit') : strlen($content)));

    header("Content-Disposition: attachment; filename=\"$fileName\"");

    header('Content-Transfer-Encoding: binary');

    if($terminate)

    {

      // clean up the application first because the file downloading could take long time

      // which may cause timeout of some resources (such as DB connection)

      Yii::app()->end(0,false);

      echo $content;

      exit(0);

    }

    else

      echo $content;

  }

  public function xSendFile($filePath, $options=array())

  {

    if(!is_file($filePath))

      return false;

    if(!isset($options['saveName']))

      $options['saveName']=basename($filePath);

    if(!isset($options['mimeType']))

    {

      if(($options['mimeType']=CFileHelper::getMimeTypeByExtension($filePath))===null)

        $options['mimeType']='text/plain';

    }

    if(!isset($options['xHeader']))

      $options['xHeader']='X-Sendfile';

    header('Content-type: '.$options['mimeType']);

    header('Content-Disposition: attachment; filename="'.$options['saveName'].'"');

    header(trim($options['xHeader']).': '.$filePath);

    if(!isset($options['terminate']) || $options['terminate'])

      Yii::app()->end();

    return true;

  }

  public function getCsrfToken()

  {

    if($this->_csrfToken===null)

    {

      $cookie=$this->getCookies()->itemAt($this->csrfTokenName);

      if(!$cookie || ($this->_csrfToken=$cookie->value)==null)

      {

        $cookie=$this->createCsrfCookie();

        $this->_csrfToken=$cookie->value;

        $this->getCookies()->add($cookie->name,$cookie);

      }

    }

    return $this->_csrfToken;

  }

  protected function createCsrfCookie()

  {

    $cookie=new CHttpCookie($this->csrfTokenName,sha1(uniqid(mt_rand(),true)));

    if(is_array($this->csrfCookie))

    {

      foreach($this->csrfCookie as $name=>$value)

        $cookie->$name=$value;

    }

    return $cookie;

  }

  public function validateCsrfToken($event)

  {

    if($this->getIsPostRequest())

    {

      // only validate POST requests

      $cookies=$this->getCookies();

      if($cookies->contains($this->csrfTokenName) && isset($_POST[$this->csrfTokenName]))

      {

        $tokenFromCookie=$cookies->itemAt($this->csrfTokenName)->value;

        $tokenFromPost=$_POST[$this->csrfTokenName];

        $valid=$tokenFromCookie===$tokenFromPost;

      }

      else

        $valid=false;

      if(!$valid)

        throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.'));

    }

  }

}

登录后复制

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public function init()

{

  parent::init();

  $this->normalizeRequest();

}

protected function normalizeRequest()

{

  // normalize request

  if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())

  {

    if(isset($_GET))

      $_GET=$this->stripSlashes($_GET);

    if(isset($_POST))

      $_POST=$this->stripSlashes($_POST);

    if(isset($_REQUEST))

      $_REQUEST=$this->stripSlashes($_REQUEST);

    if(isset($_COOKIE))

      $_COOKIE=$this->stripSlashes($_COOKIE);

  }

  if($this->enableCsrfValidation)

    Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));

}

public function stripSlashes(&$data)

{

  return is_array($data)&#63;array_map(array($this,'stripSlashes'),$data):stripslashes($data);

}

登录后复制

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

常用的有如下方法:

获取get参数

1

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

登录后复制

获取get参数

1

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

登录后复制

获取post数据

1

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

登录后复制

获取请求的url

1

public function getUrl()

登录后复制

获取主机信息

1

public function getHostInfo($schema='')

登录后复制

设置

1

public function setHostInfo($value)

登录后复制

获取根目录

1

public function getBaseUrl($absolute=false)

登录后复制

获取当前url

1

public function getScriptUrl()

登录后复制

获取请求的url

1

public function getRequestUri()

登录后复制

获取querystring

1

public function getQueryString()

登录后复制

判断是否是https

1

public function getIsSecureConnection()

登录后复制

获取请求类型

1

public function getRequestType()

登录后复制

是否是post请求

1

public function getIsPostRequest()

登录后复制

是否是ajax请求

1

public function getIsAjaxRequest()

登录后复制

获取服务器名称

1

public function getServerName()

登录后复制

获取服务端口

1

public function getServerPort()

登录后复制

获取引用路径

1

public function getUrlReferrer()

登录后复制

获取用户ip地址

1

public function getUserHostAddress()

登录后复制

获取用户主机名称

1

public function getUserHost()

登录后复制

获取执行脚本名称

1

public function getScriptFile()

登录后复制

获取cookie

1

public function getCookies()

登录后复制

重定向

1

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

登录后复制

设置下载文件头

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

public function sendFile($fileName,$content,$mimeType=null,$terminate=true)

{

if($mimeType===null)

{

if(($mimeType=CFileHelper::getMimeTypeByExtension($fileName))===null)

$mimeType='text/plain';

}

header('Pragma: public');

header('Expires: 0');

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

header("Content-type: $mimeType");

if(ini_get("output_handler")=='')

header('Content-Length: '.(function_exists('mb_strlen') &#63; mb_strlen($content,'8bit') : strlen($content)));

header("Content-Disposition: attachment; filename=\"$fileName\"");

header('Content-Transfer-Encoding: binary');

if($terminate)

{

// clean up the application first because the file downloading could take long time

// which may cause timeout of some resources (such as DB connection)

Yii::app()->end(0,false);

echo $content;

exit(0);

}

else

echo $content;

}

public function xSendFile($filePath, $options=array())

{

if(!is_file($filePath))

return false;

if(!isset($options['saveName']))

$options['saveName']=basename($filePath);

if(!isset($options['mimeType']))

{

if(($options['mimeType']=CFileHelper::getMimeTypeByExtension($filePath))===null)

$options['mimeType']='text/plain';

}

if(!isset($options['xHeader']))

$options['xHeader']='X-Sendfile';

header('Content-type: '.$options['mimeType']);

header('Content-Disposition: attachment; filename="'.$options['saveName'].'"');

header(trim($options['xHeader']).': '.$filePath);

if(!isset($options['terminate']) || $options['terminate'])

Yii::app()->end();

return true;

}

登录后复制

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

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
《CSRF的攻击方式详解 黑客必备知识》

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

public function getCsrfToken()

{

if($this->_csrfToken===null)

{

$cookie=$this->getCookies()->itemAt($this->csrfTokenName);

if(!$cookie || ($this->_csrfToken=$cookie->value)==null)

{

$cookie=$this->createCsrfCookie();

$this->_csrfToken=$cookie->value;

$this->getCookies()->add($cookie->name,$cookie);

}

}

return $this->_csrfToken;

}

protected function createCsrfCookie()

{

$cookie=new CHttpCookie($this->csrfTokenName,sha1(uniqid(mt_rand(),true)));

if(is_array($this->csrfCookie))

{

foreach($this->csrfCookie as $name=>$value)

$cookie->$name=$value;

}

return $cookie;

}

public function validateCsrfToken($event)

{

if($this->getIsPostRequest())

{

// only validate POST requests

$cookies=$this->getCookies();

if($cookies->contains($this->csrfTokenName) && isset($_POST[$this->csrfTokenName]))

{

$tokenFromCookie=$cookies->itemAt($this->csrfTokenName)->value;

$tokenFromPost=$_POST[$this->csrfTokenName];

$valid=$tokenFromCookie===$tokenFromPost;

}

else

$valid=false;

if(!$valid)

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

class PostController extends CController

{

  public function actionCreate()

  {

    if(isset($_GET['category']))

      $category=(int)$_GET['category'];

    else

      throw new CHttpException(404,'invalid request');

    if(isset($_GET['language']))

      $language=$_GET['language'];

    else

      $language='en';

    // ... fun code starts here ...

  }

}

登录后复制

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

1

2

3

4

5

6

7

8

class PostController extends CController

{

  public function actionCreate($category, $language='en')

  {

    $category=(int)$category;

    // ... fun code starts here ...

  }

}

登录后复制

注意我们在动作方法 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

2

3

4

5

6

7

class PostController extends CController

{

  public function actionCreate(array $categories)

  {

    // Yii will make sure $categories be an array

  }

}

登录后复制

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中是不会出错的

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

您可能感兴趣的文章:

  • YII Framework的filter过滤器用法分析
  • 简介PHP的Yii框架中缓存的一些高级用法
  • 深入解析PHP的Yii框架中的缓存功能
  • PHP的Yii框架中View视图的使用进阶
  • PHP的Yii框架中Model模型的学习教程
  • 详解PHP的Yii框架中的Controller控制器
  • Yii数据库缓存实例分析
  • Yii开启片段缓存的方法
  • 详解PHP的Yii框架中组件行为的属性注入和方法注入
  • 详解在PHP的Yii框架中使用行为Behaviors的方法

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1117062.htmlTechArticleYII Framework学习之request与response用法(基于CHttpRequest响应),yiichttprequest 本文实例讲述了YII Framework学习之request与response用法。分享给大家供大...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板