我正在尝试制作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
管理重定向是一个好主意吗?还是应该以其他方式尝试?答案 0 :(得分:1)
如前所述,从语义的角度来看,重定向是在引发异常时采取的一种动作,实际上并不是很准确。通常,重定向是在用于向客户端提供响应的层中实现的,因为重定向是从技术角度实际在此处实现为标头(Location
)。
一个非常粗糙的例子是,当您的MVC架构中的控制器能够提供“响应”(作为其状态的一部分可以发出重定向信号)时,例如
class SomeController {
public function home(Request $request, Response $response) {
return $response->redirect('/somewhere');
}
}
在其实现中,只需将Location: /somewhere
标头附加到Web应用程序提供给客户端的响应即可。