在PHP MVC框架中,我如何干净地和优雅地退出当前控制器/操作,但是继续正常执行脚本?
例如,假设我的框架通常遵循以下大纲:
现在,假设我想在“Do Stuff”步骤中的某个位置停止“正常”执行,比如渲染不同的视图,或者执行标题重定向,我想停止处理剩下的身体动作,但继续进行“过程输出”步骤
如何以最佳方式实现这一目标?我唯一的想法是:
//in controller
protected function redirect($url) {
header("Location: $url");
exit();
}
但这完全忽略了框架执行的其余部分,并将输出缓冲区中的任何内容直接转储给用户。另一种选择:
//in dispatcher
call_user_func_array(array($controller,$action),$params);
afterwards:
...
//in controller
protected function redirect($url) {
header("Location: $url");
goto afterwards;
}
然而,这让我twitch反对我所学到的一切,特别是因为它所引用的标签完全在另一个文件中。
那么,还有其他方法可以达到这个目的吗?
注意:重定向示例可能应该使用exit()
方式,因为我们只是重定向到另一个页面而不关心输出。我正在寻找一种通用解决方案。
答案 0 :(得分:3)
在Action方法中,您可以在字符串中收集所有输出而不是将其打印出来。仅在方法结束时打印出来。如果你需要重定向或拯救,那么你还没有输出任何东西,你可以重定向或从方法返回。
答案 1 :(得分:2)
也许您可以编写一个自定义异常来表示“在'Do Stuff'中停止正常执行”步骤?这很麻烦......但它会起作用。
答案 2 :(得分:0)
你需要抽象更多东西。不要只是输出一个动作!不要设置标题,因为之前可能会出现这么多错误。有不同的处理程序。响应处理程序处理响应并根据您的回应采取行动。不要只输出内部动作。如果你有错误抛出异常用exceptionhadler捕获它们等等。
基本控制器动作
public function view(int $user_id): ResponseHandler {
$this->validate($user_id); //throws exception
if (1 == 2) throw new ControllerInvalidArgumentException();
$view = new View('nameof view');
return new ResponseHandler($view);
}
只需看看现有的框架,他们就可以很好地实现laravel或symfony等设计模式。不知道你尝试什么只是不写自己的框架。如果你想学习阅读并从别人那里学习,如果你理解他们为什么这么做,你就会知道怎么做。