【问题标题】:Reusable content blocks in CakePHPCakePHP 中的可重用内容块
【发布时间】:2013-03-08 15:44:07
【问题描述】:

我想问一下在 CakePHP 1.3 中创建可重用内容块的最佳方法。

在可重复使用的内容块下,我指的是用于构建页面的部分视图。例如。在 eshop 应用程序中,迷你车摘要可以被视为可重用的内容块 - 它显示在每个页面标题上。

在 CakePHP 1.3 中有两种可能性(两者都有严重的缺点):

  • 创建元素 /app/plugins/myeshop/elements/minicart.ctp 并使用 $this->element('minicart) 加载此可重用内容,例如在标题中。缺点是这会将 Cart 实体的业务分成很多地方。 Minicart 只是 Cart 实体的一些表示,其视图由控制器 /app/plugins/myeshop/controllers/carts_controller.php 处理。那么为什么要把它从控制器中取出并保留在元素中呢?元素可以很好地保留一些通用的可重用内容,例如header, footer, interactive_map, ... 与应用业务对象/实体无关的东西。

  • 使用相应视图创建方法 CartsController::minicart() 并使用 $this->requestAction('/myeshop/carts/minicart') 加载此可重用内容,例如在标题中。 优点是 现在 Cart 实体的所有业务和视图都由 CartsController 处理。元素中没有隐藏侧面逻辑和侧面视图。 这种方法的缺点很明显 - 使用 requestAction() 会花费大量时间。

在这一点上我必须说我完全同意 requestAction() 必须非常小心地使用。用它来调用控制器的一些程序/业务逻辑是糟糕的应用程序设计。这种逻辑不应该放在控制器中,而应该放在模型中。尽管如此,恕我直言,调用控制器操作以获取部分/可重用内容(视图)并将实体业务保持在一个位置是合法的。

CakePHP 对此有什么最佳解决方案吗?

【问题讨论】:

    标签: php cakephp cakephp-1.3


    【解决方案1】:

    我强烈建议走元素/requestActions 的路线。

    这是 CakePHP Master Mark Story 的一篇精彩文章:"How using requestAction increased performance on my site"

    我们使用 CakePHP 构建了许多大型、高流量的网站,并且到处都使用 requestActions,而且我们的网站加载速度非常快。

    【讨论】:

    • 感谢您的回答。似乎使用元素是不可避免的,尽管只是为了缓存 requestAction() 的结果。
    【解决方案2】:

    如果可能的话,我会将它创建为一个元素。我假设您的控制器将计算迷你购物车的内容并在视图中显示它?

    如果是这样,使用元素就可以了。正如您所说,您当然不想要额外的 HTTP 请求。

    但是,元素应该只显示内容,它应该执行任何业务逻辑。您需要将其包含在控制器或组件中,并为视图设置必要的元素。

    如果您只在某些页面上需要它,您可以创建一个包含迷你购物车的新 layout.ctp 文件,然后在这些页面上使用此布局。

    【讨论】:

      【解决方案3】:

      如果这只是在每个页面上显示购物车的内容,我推荐此解决方案:如果用户未登录并将购物车与数据库同步登录,则将购物车写入会话。如果用户返回并登录,则从保存的购物车中恢复会话。

      在您的 AppController::beforeFilter() 中读取会话数据并将其设置到视图中,或者如果它只是读取,请使用您的 minicart 元素中的会话助手读取它。您不会有额外的 requestAction() 调用或任何额外的数据库查询。

      我已经这样实现了我的购物车,你可以在这里看看。 https://github.com/burzum/cart 还提供了一个工作示例应用程序https://github.com/burzum/CartSampleApp

      【讨论】:

      • 谢谢 :),但 eshop 购物车只是可重用内容块的一个示例。我问过如何在 CakePHP 中创建可重用的内容块。可重复使用的内容/视图的另一个示例:相关产品、前 10 名产品、新闻、最近的帖子……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多