假设我们有OrderController
控制器,有三个操作/页面:orderDetailsAction
、orderHistoryAction
、orderCustomerDetailsAction
这些操作中的每一个都返回一些 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