Home Backend Development PHP Tutorial Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解_php实例

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

Jun 07, 2016 pm 05:09 PM
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

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

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

<&#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;

  }

}

Copy after login

Zend_Controller_Request_Http

Zend_Controller_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

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

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

<&#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;

  }

}

Copy after login

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

模块名可通过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类:

1

2

$request = new Zend_Controller_Request_Apache404();

$front->setRequest($request);

Copy after login

这个类继承了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设置最容易,它将导入基地址到请求对象。定制基地址的用法举例:

1

2

3

4

5

6

7

8

9

/**

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

Copy after login

判断请求方式

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程序设计有所帮助。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Microsoft NET Framework Installation Issues Error Code 0x800c0006 Fix Microsoft NET Framework Installation Issues Error Code 0x800c0006 Fix May 05, 2023 pm 04:01 PM

.NET Framework 4 is required by developers and end users to run the latest versions of applications on Windows. However, while downloading and installing .NET Framework 4, many users complained that the installer stopped midway, displaying the following error message - " .NET Framework 4 has not been installed because Download failed with error code 0x800c0006 ". If you are also experiencing it while installing .NETFramework4 on your device then you are at the right place

How to identify Windows upgrade issues using SetupDiag on Windows 11/10 How to identify Windows upgrade issues using SetupDiag on Windows 11/10 Apr 17, 2023 am 10:07 AM

Whenever your Windows 11 or Windows 10 PC has an upgrade or update issue, you will usually see an error code indicating the actual reason behind the failure. However, sometimes confusion can arise when an upgrade or update fails without an error code being displayed. With handy error codes, you know exactly where the problem is so you can try to fix it. But since no error code appears, it becomes challenging to identify the issue and resolve it. This will take up a lot of your time to simply find out the reason behind the error. In this case, you can try using a dedicated tool called SetupDiag provided by Microsoft that helps you easily identify the real reason behind the error.

SCNotification has stopped working [5 steps to fix it] SCNotification has stopped working [5 steps to fix it] May 17, 2023 pm 09:35 PM

As a Windows user, you are likely to encounter SCNotification has stopped working error every time you start your computer. SCNotification.exe is a Microsoft system notification file that crashes every time you start your PC due to permission errors and network failures. This error is also known by its problematic event name. So you might not see this as SCNotification having stopped working, but as bug clr20r3. In this article, we will explore all the steps you need to take to fix SCNotification has stopped working so that it doesn’t bother you again. What is SCNotification.e

Microsoft .NET Framework 4.5.2, 4.6, and 4.6.1 will end support in April 2022 Microsoft .NET Framework 4.5.2, 4.6, and 4.6.1 will end support in April 2022 Apr 17, 2023 pm 02:25 PM

Microsoft Windows users who have installed Microsoft.NET version 4.5.2, 4.6, or 4.6.1 must install a newer version of the Microsoft Framework if they want Microsoft to support the framework through future product updates. According to Microsoft, all three frameworks will cease support on April 26, 2022. After the support date ends, the product will not receive "security fixes or technical support." Most home devices are kept up to date through Windows updates. These devices already have newer versions of frameworks installed, such as .NET Framework 4.8. Devices that are not updating automatically may

PHP Implementation Framework: Zend Framework Getting Started Tutorial PHP Implementation Framework: Zend Framework Getting Started Tutorial Jun 19, 2023 am 08:09 AM

PHP implementation framework: ZendFramework introductory tutorial ZendFramework is an open source website framework developed by PHP and is currently maintained by ZendTechnologies. ZendFramework adopts the MVC design pattern and provides a series of reusable code libraries to serve the implementation of Web2.0 applications and Web Serve. ZendFramework is very popular and respected by PHP developers and has a wide range of

How to use ACL (Access Control List) for permission control in Zend Framework How to use ACL (Access Control List) for permission control in Zend Framework Jul 29, 2023 am 09:24 AM

How to use ACL (AccessControlList) for permission control in Zend Framework Introduction: In a web application, permission control is a crucial function. It ensures that users can only access the pages and features they are authorized to access and prevents unauthorized access. The Zend framework provides a convenient way to implement permission control, using the ACL (AccessControlList) component. This article will introduce how to use ACL in Zend Framework

KB5012643 for Windows 11 breaks .NET Framework 3.5 apps KB5012643 for Windows 11 breaks .NET Framework 3.5 apps May 09, 2023 pm 01:07 PM

It's been a week since we talked about the new safe mode bug affecting users who installed KB5012643 for Windows 11. This pesky issue didn't appear on the list of known issues Microsoft posted on launch day, thus catching everyone by surprise. Well, just when you thought things couldn't get any worse, Microsoft drops another bomb for users who have installed this cumulative update. Windows 11 Build 22000.652 causes more problems So the tech company is warning Windows 11 users that they may experience problems launching and using some .NET Framework 3.5 applications. Sound familiar? But please don't be surprised

Cooler Master and Framework launch innovative mini case kit, compatible with laptop motherboards Cooler Master and Framework launch innovative mini case kit, compatible with laptop motherboards Dec 15, 2023 pm 05:35 PM

According to news on December 9, Cooler Master recently demonstrated a mini chassis kit in cooperation with notebook modular solution provider Framework at a demonstration event at the Taipei Compute Show. The unique thing about this kit is that it can be compatible with and Install the motherboard from the framework notebook. Currently, this product has begun to be sold on the market, priced at 39 US dollars, which is equivalent to approximately 279 yuan at the current exchange rate. The model number of this chassis kit is named "frameWORKMAINBOARDCASE". In terms of design, it embodies the ultimate compactness and practicality, measuring only 297x133x15 mm. Its original design is to be able to seamlessly connect to framework notebooks

See all articles