PHP MVC:如何尽早退出动作/控制器?

时间:2010-06-28 15:44:44

标签: php model-view-controller

在PHP MVC框架中,我如何干净地优雅地退出当前控制器/操作,但是继续正常执行脚本?

例如,假设我的框架通常遵循以下大纲:

  1. 将URL映射到Controller / Action
  2. 实例化控制器,调用Action(捕获输出)
    1. 做事
    2. 渲染视图
    3. 在Action方法结束时,继续正常操作
  3. 必要时处理输出
  4. 将输出发送到浏览器
  5. 现在,假设我想在“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()方式,因为我们只是重定向到另一个页面而不关心输出。我正在寻找一种通用解决方案。

3 个答案:

答案 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等设计模式。不知道你尝试什么只是不写自己的框架。如果你想学习阅读并从别人那里学习,如果你理解他们为什么这么做,你就会知道怎么做。