MVC从另一个控制器的动作调用另一个控制器的动作

时间:2012-07-07 12:57:28

标签: php model-view-controller

让我们假设我们OrderController控制器有三个操作/页面:orderDetailsActionorderHistoryActionorderCustomerDetailsAction

每个动作都返回一些HTML。

现在我想要同时包含所有3个html片段的页面,但是我不想做3个ajax调用来完成这个

我正在创建其他控制器的操作方法(例如orderSummaryAction)。这个方法应该包含这样的东西。

public function orderSummartyAction {
   ob_start();
   Application::factory()->run('/order/details');
   Application::factory()->run('/order/history');
   Application::factory()->run('/order/customer_details');     
   $out = ob_get_clean();
   $this->getResponse()->setHtml($out);
}

是否有任何框架在做这样的事情或者可能是不好的做法(那么什么是更好的做法)?

谢谢!

UPD:或者我们可以传递不是字符串url,而是路由来创建新的Application实例。这将是更好的,imho。

2 个答案:

答案 0 :(得分:1)

我想说,问题的原因是无效的MVC实现。

生成HTML不是控制器的责任。相反,输出应该由 view 实例创建 - 一个处理表示逻辑和多个模板的对象。与RoR一直试图为我们提供的信息相反 - 视图不是模板

在适当的MVC中,控制器负责直接根据用户输入或某种Request实例更改模型层和所选视图的状态

另外,两个旁注

  • 请不要使用工厂方法模式 [1] [2] 。恕我直言,这是一个反模式,因为它导致类之间的紧密耦合并吸引复杂性(它们往往不受控制地增长)。
  • 它可能很有用,而不是返回大块的HTML,用JSON格式的数据响应XHR调用。然后在客户端生成HTML。

答案 1 :(得分:0)

Symfony2使用子请求来调用多个控制器。 您可以在此处{嵌入控制器'http://symfony.com/doc/current/book/templating.html

下找到更多详细信息