0

我想问一下在 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 处理。那么为什么要把它从控制器中取出并保留在元素中呢?元素可以很好地保留一些通用的可重用内容,例如页眉、页脚、interactive_map ……与应用程序业务对象/实体无关的东西。

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

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

CakePHP 对此有一些最佳解决方案吗?

4

3 回答 3

0

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

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

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

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

于 2013-03-08T15:52:11.700 回答
0

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

这是 CakePHP Master Mark Story 的一篇精彩文章: “如何使用 requestAction 提高我网站的性能”

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

于 2013-03-08T16:18:24.043 回答
0

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

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

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

于 2013-03-08T16:32:54.560 回答