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


MVC calling another controller's action from another controller's action

假设我们有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,而是路由来创建新的应用程序实例。恕我直言,这会好得多。

我会

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

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

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

另外,两个旁注

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

Symfony2 使用子请求来调用多个控制器。您可以在"嵌入控制器"下找到更多详细信息 此处 http://symfony.com/doc/current/book/templating.html