【问题标题】:Basic CakePHP architecture: Accessing multiple controllers / models in one view基本 CakePHP 架构:在一个视图中访问多个控制器/模型
【发布时间】:2016-03-30 20:19:23
【问题描述】:

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

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

  • 已发表的文章(模型文章的 action view())
  • 为那篇文章写评论的小部件(模型评论的操作 add())
  • 其他用户的 cmets 列表(模型 Comment 的 action index())

这是一个非常常见的用例,但目前我无法真正理解 CakePHP 的“预期”解决方法是什么。我在想:

  • 为上述用例提供一个控制器,用于处理多个模型。
  • 每个模型有一个控制器,但有一个视图,其中包含连接到不同控制器的某种子视图

对我来说,后者似乎是更清洁的方法,因为它允许重用子视图并避免控制器中的代码重复,但根据我所读到的内容,我不确定 CakePHP 是否真的可以做到那。任何建议表示赞赏。

【问题讨论】:

    标签: php cakephp architecture cakephp-2.0


    【解决方案1】:

    这是一个非常常见的用例,但目前我无法真正理解 CakePHP 的“预期”解决方法是什么。

    这不是 CakePHP 特有的,但您可能在任何 MVC 框架中都会遇到相同类型的“问题”。这都是关于正确的SoC

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

    差不多了。

    通常,您会在该页面的操作中获得该页面所需显示的所有数据。注意:这并不意味着用数百行代码使控制器膨胀。您可以通过文章关联获取 cmets,因为一篇文章有​​很多 cmets - 这就是您的关联。

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

    评论表单会向 cmets 控制器添加操作并重定向回使用来源。

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

    对于 cmets,我个人最喜欢的是用于 cmets 的 CakePHP 插件,它带有 RESTful API 和基于 JS 的前端小部件。基本上是流行的 Disqus 小部件的简约克隆。只需将小部件放入您的页面,即可让 cmets 以最可重用的方式在任何页面上立即工作。 :)

    【讨论】:

    • 你提出了一些很好的观点。我在 CakePHP 2.x 上,所以视图单元格似乎对我不可用,这意味着我必须使用 Elements 和 requestAction()。我个人不喜欢根据视图调整控制器,因为我觉得它破坏了我们首先使用 MVC 的原因。我会把这个问题留得更久一些,也许关于这个话题还有其他的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多