【问题标题】:PHP MVC StructurePHP MVC 结构
【发布时间】:2011-11-14 15:58:15
【问题描述】:

作为大学项目的一部分,我正在用 PHP 开发一个 Web 应用程序,并尝试尽可能地遵循 MVC 原则。我没有使用现成的框架,因为我希望尽可能多的项目成为我的工作,以帮助获得更高的分数。

要从数据库中删除一个项目(每个项目都有一个 id、status、title、parent_id),我会执行以下过程....

  • 用户点击删除按钮并被要求确认
  • 当点击确认加载一个调用控制器的“页面”时,会启动一个存储在控制器对象中的模型
  • 调用模型对象中的方法以根据 URL 中的 ID 从数据库中加载项目
  • 我在模型中编辑状态属性以将项目标记为已删除
  • 然后我将模型保存到实际上删除它的数据库中。

我还想删除数据库中刚刚删除的项目的所有子项目。最好的地方在哪里?在控制器中?在单独的函数文件中?在模型文件中?

我对整个 MVC 想法还很陌生,因此非常感谢任何帮助/建议。

【问题讨论】:

  • 删除模型时删除模型的相关记录是一个实现细节,应该在模型中完成并且对控制器隐藏。这是模型明确的用途,也是您希望将此逻辑提炼到模型层的最大原因。
  • 或使用 ON DELETE CASCADE 创建数据库关系。 (这就是我通常做的)。虽然这不是很 MVC :P

标签: php model-view-controller


【解决方案1】:

MVC的基本分解是

  • 模型:业务逻辑
  • 视图:表示逻辑
  • 控制器:粘合逻辑(根据用户输入触发模型功能,根据模型输出渲染视图)。

“删除一项将导致其所有子项也被删除”的语句是对业务逻辑中需要发生的事情的描述。因此,它属于模型。

实现取决于您如何实现在模型中获取子项和删除项,但通常包括在其删除方法中获取模型子项的集合,并为集合中的每个子项调用删除方法(发生这种情况时,每个孩子也会寻找孩子并删除它们)。现在视图和控制器不必担心模型是否有子模型,因为这一切都在模型的业务逻辑中得到处理。

【讨论】:

    【解决方案2】:

    成为一名优秀的开发人员的一部分是知道何时重新发明轮子。这当然是其中一种情况。我建议您首先询问您的教授是否允许您使用现成的框架。这种“我希望尽可能多的项目成为我的工作”几乎是无稽之谈。如果您真的希望它成为您自己的工作,请在汇编程序中进行:)。

    如果您仍然需要从头开始编写所有内容(使用 PHP),我建议您首先查看成熟的 MVC 框架(例如Symfony),以便了解这样的框架应该如何工作。也可以看看source code

    【讨论】:

    • 对不起,但我不同意你(不是不)使用框架的观点。我首先要了解如何编写基于 mvc 的应用程序,然后使用框架。否则,您将失去管理应用程序的所有机会。我记得我第一次使用 Zend,很尴尬。虽然我对 mvc 的工作原理有基本的了解,但我花了一周左右的时间才进入框架。
    • 不发明轮子评论是一个好点。但是,它没有回答“应该在哪里删除孩子?”的问题
    • @mAu 1 周的框架是一个不错的学习曲线。 你的第一个框架的 1 周实际上是值得称赞的。另外,如何在不使用 MVC 框架的情况下获得如何编写基于 MVC 的应用程序的基本知识?自己写?你怎么知道它应该如何工作?我在 RoR 工作,在开始之前我对 MVC 是什么有所了解,但它似乎真的很模糊。实际上,对 RoR 感到沮丧和肮脏彻底颠覆了我的世界,我终于明白了 MVC 模式真正的含义。
    • 通常这肯定是一个很好的建议,但大学不只是为了解决问题,而是为了理解更高层次的东西。假设他解决了使用现在很棒的框架的问题,到他毕业时,这个框架将过时,他的知识也将过时。
    • @duedl0r 不要那么肯定它会过时(为什么会过时?)。另外,重要的不是他学习了一个特定的框架,而是他正确理解了 MVC 模式的概念。 IMO,做到这一点的最佳方法是使用已建立的框架。另外,如果我每次在大学里学到的东西都被弃用了至少十年...
    【解决方案3】:

    我可能会在 PHP MVC 模式之外这样做。使用 MySQL innoDB 表,您可以使用Foreign Keys

    CREATE TABLE parent (id INT NOT NULL,
                         PRIMARY KEY (id)
    ) ENGINE=INNODB;
    CREATE TABLE child (id INT, parent_id INT,
                        INDEX par_ind (parent_id),
                        FOREIGN KEY (parent_id) REFERENCES parent(id)
                          ON DELETE CASCADE
    ) ENGINE=INNODB;
    

    【讨论】:

    • 谢谢你,我应该提到我宁愿尽可能多地保留在 PHP 中而不是 SQL 中——知道我会忘记 SQL 在那里。不过,这对我正在做的其他事情很有用!
    • 不客气。如果您将所有逻辑都保留在 PHP 中,那么您应该按照 GordonM 所说的去做并将其放入模型中
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2016-09-22
    • 1970-01-01
    • 2014-03-27
    • 2010-11-01
    相关资源
    最近更新 更多