CakePHP的基本架构:在一个视图中访问多个控制器/模型


Basic CakePHP architecture: Accessing multiple controllers / models in one view

我最近开始使用CakePHP,虽然食谱是一个不错的资源,但它并不能真正回答我的基本问题。

默认情况下,CakePHP的体系结构似乎认为在一个模型的控制器中,一个操作有一个视图。但假设我有一个典型的博客应用程序,从用户的角度来看,它的常见视图包括:

  • 已发布的文章(模型文章的action view())
  • 为该文章编写注释的小部件(模型注释的action add())
  • 其他用户的评论列表(模型评论的action index())

这是一个非常常见的用例,但目前我还不能真正理解CakePHP的"预期"解决方法

  • 对于上面的用例有一个控制器,它处理多个模型
  • 每个模型有一个控制器,但有一个包含某种子视图的视图,这些子视图连接到不同的控制器

对我来说,后者似乎是更干净的方法,因为它可以重用子视图,并避免控制器中的代码重复,但从我所读到的内容来看,我不确定CakePHP是否真的能做到这一点。欢迎提出任何建议。

这是一个非常常见的用例,但目前我还不能真正理解CakePHP的"预期"解决方法

这并不是CakePHP特有的,但在任何MVC框架中都会遇到同样的"问题"。这一切都是关于正确的SoC。

每个模型有一个控制器,但有一个包含某种子视图的视图,这些子视图连接到不同的控制器

很接近。

通常情况下,您会在页面的操作中获得页面所需显示的所有数据。注意:这并不意味着要用数百行代码夸大控制器。你可以通过文章关联获取评论,因为一篇文章有很多评论——这就是你的关联。

您也可以使用视图单元格来显示内容。如果可能的话,我个人更愿意尝试在不使用单元格的情况下获取所有数据。但我认为这是一个品味问题。

评论表单将向评论控制器发布添加操作的帖子,并重定向回使用的来源。

您可以编写一个充当代理的组件,并向控制器透明地添加addComment和editComment"方法",以使其易于重用并避免代码重复。我不打算在这里描述整个过程,它只是很长,但我想你已经明白了。

在评论的情况下,我个人最喜欢的是一个CakePHP插件,用于带有RESTful API和基于JS的前端小部件的评论。基本上是流行的Disqus小部件的极简主义克隆。只需将小部件放入您的页面,即可立即以最可重复使用的方式在任何页面上获得评论。:)