2010-06-28 65 views
5

在一个PHP MVC框架中,我该如何干净优雅退出当前控制器/操作,但继续正常的脚本执行?PHP MVC:如何尽早退出Actions/Controllers?

例如,假设我的框架通常遵循这个纲要:

  1. 地图URL到控制器/动作
  2. 实例化控制器,调用动作(捕获输出)
    1. 做的东西
    2. 渲染视图
    3. 在操作结束时,继续正常操作
  3. 过程输出如有必要
  4. 输出发送到浏览器

现在,让我们说,我想阻止“正常”执行中“做的东西”步的地方,比方说,呈现了不同的看法,或做一个标题重定向,我想停止处理Action的其余部分,但继续进行“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

在您的Action方法中,您可以将所有输出收集到一个字符串中,而不是将其打印出来。仅在方法结束时打印出来。如果你需要重定向或保释,那么你还没有输出任何东西,你可以重定向或从方法返回。

+0

+1用于缓冲Action的输出。 – 2010-06-28 15:52:03

2

也许你可以编写一个自定义异常来表示“停止正常执行”'执行''步骤?这很混乱......但它会起作用。

+0

哇,我没有想到这一点!当然,它违反了异常的想法,但它会冒泡直到碰到一个catch(EarlyExitException)',我可以将其包裹在我的调度方法中...... – 2010-06-28 15:57:21

+0

正是......除了整个“它违反了异常的想法“,因为PHP还没有”Throwable“接口。 – 2010-06-28 16:01:49

+1

例外应该用于特殊(错误)情况。这听起来像“渲染不同的观点”更像是流量控制问题。如果是这样,则不应在“正常”条件下使用例外。 – 2010-06-28 16:08:10

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的非常好implemntations。不确定你尝试什么,只是不写你自己的框架。如果你想学习阅读和学习他人,如果你明白他们为什么他们会做,你会知道该怎么做。

+0

感谢您的回复。注意到a)当我在6年前提出这个问题时,我正在通过自己编写探索许多大型框架背后的概念,b)当时PHP是一个不同的野兽。也就是说,我同意你的观点,即正确的方法是创建更大的抽象并在其基础上构建,但有时候你想避免太多的抽象。恕我直言,Laravel和Symfony是伟大的,但如果你只是想要简单的东西非常沉重。 – 2016-06-25 18:40:30

+0

现在,我倾向于结合使用单个库来组成更大的PHP框架。 [PHP联盟](http://thephpleague.com/)拥有很多图书馆来帮助解决这个问题,还有许多其他的。 – 2016-06-25 18:44:20