CakePHP中可重用的内容块

时间:2013-03-08 15:44:07

标签: php cakephp cakephp-1.3

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

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

在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')加载此可重用内容,例如在标题中。 优势现在,CartsController会处理Cart实体的所有业务和视图。元素中没有隐藏的侧逻辑和侧视图。 这种方法的缺点是明显 - 使用requestAction()需要花费大量时间。

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

CakePHP是否有针对此的最佳解决方案?

3 个答案:

答案 0 :(得分:0)

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

如果是这样可以使用元素。您当然不需要额外的HTTP请求。

但是,元素应该只显示内容,它应该执行任何业务逻辑。您需要在Controller或Component中包含此内容,并为视图设置必要的元素。

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

答案 1 :(得分:0)

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

以下是CakePHP马克故事大师的精彩文章:"How using requestAction increased performance on my site"

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

答案 2 :(得分:0)

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

在AppController :: beforeFilter()中读取会话数据并将其设置为视图,或者如果只读取会话数据,请使用minicart元素中的会话帮助程序读取它。您将不会通过此查询或任何其他数据库查询进行其他requestAction()调用。

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