代码之家  ›  专栏  ›  技术社区  ›  Austin Hyde

phpmvc:如何尽早退出Actions/Controllers?

  •  6
  • Austin Hyde  · 技术社区  · 15 年前

    干净利落 优雅地

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

    1. 将URL映射到控制器/操作
    2. 实例化控制器,调用操作(捕获输出)
      1. 做些事情
      2. 渲染窗口
      3. 在操作方法结束时,继续正常操作
    3. 将输出发送到浏览器

    现在,假设我想在“Do Stuff”步骤中的某个地方停止“正常”执行,例如,呈现一个不同的视图,或者执行头重定向,我想停止处理操作体的其余部分,但是继续到“Process output”步骤

    我怎样才能以最好的方式实现这一点?我唯一的想法是:

    //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 回复  |  直到 15 年前
        1
  •  3
  •   Scott Saunders    15 年前

    在Action方法中,可以将所有输出收集在一个字符串中,而不是打印出来。只在方法末尾打印出来。如果您需要重定向或退出,那么您还没有输出任何内容,您可以重定向或从方法返回。

        2
  •  2
  •   Richard JP Le Guen    15 年前

        3
  •  0
  •   di3    9 年前

    你需要抽象更多的东西。不要只在动作中输出!不要设置标题,因为以前可能会出错很多。有不同的处理程序。响应处理程序。根据你的反应来处理和行动。不要只输出内部操作。如果有错误,抛出异常并用异常hadler捕捉它们,依此类推。

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

    只要看看现有的框架,他们有非常好的设计模式,如拉威尔或symfony的实现。不知道你尝试了什么只是不要写你自己的框架。如果你想学读书,向别人学习,如果你了解他们做什么,你就会知道怎么做。

    推荐文章