在PHP中重定向的正确方法是什么

时间:2019-01-26 11:13:29

标签: php

我正在尝试制作MVC php框架。我正在尝试编写可测试的代码。我知道exit之后的die()header("Location: http://example.com");不是一个好的解决方案。

这就是我目前正在执行重定向的方式:
这是我的代码的简单版本。

<?php
// create a RedirectException class
class RedirectException extends \Exception {}

<?php
// it is index.php
try {
    include 'view.php'
}  catch (RedirectException $e) {
    header(sprintf("Location: %s", $e->getMessage());
    header('HTTP/1.1 302 Found', true, 302);
} catch (Exception $exception) {
    // print exception here or, do something else
} 

<?php
// it is view.php
$url = 'http://example.com';
throw new RedirectException($url);

当我运行index.php

时,该流程应该可以正常工作

在我看来,我的做法是正确的。
问题不在于响应代码。

问题是,我需要知道:使用Exception管理重定向是一个好主意吗?还是应该以其他方式尝试?

1 个答案:

答案 0 :(得分:1)

如前所述,从语义的角度来看,重定向是在引发异常时采取的一种动作,实际上并不是很准确。通常,重定向是在用于向客户端提供响应的层中实现的,因为重定向是从技术角度实际在此处实现为标头(Location)。

一个非常粗糙的例子是,当您的MVC架构中的控制器能够提供“响应”(作为其状态的一部分可以发出重定向信号)时,例如

class SomeController {
  public function home(Request $request, Response $response) {
    return $response->redirect('/somewhere');
  }
}

在其实现中,只需将Location: /somewhere标头附加到Web应用程序提供给客户端的响应即可。