【问题标题】:MVC calling another controller's action from another controller's actionMVC 从另一个控制器的动作中调用另一个控制器的动作
【发布时间】:2012-07-07 12:57:28
【问题描述】:

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

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

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

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

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

    另外,还有两个旁注

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2013-05-28
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多