【问题标题】:Creating and combining controllers in an MVC PHP web application在 MVC PHP Web 应用程序中创建和组合控制器
【发布时间】:2009-07-13 15:49:22
【问题描述】:

在过去的几周里,我一直在研究使用 PHP 的 Web 应用程序的 MVC 设计模式。从广泛的角度来看,我了解该模式的工作原理以及为什么它是实现任何类型的 Web 应用程序(无论大小)的一种非常好的方式。

据我了解,我们有 3 个不同的层,它们通过控制器相互通信,如下所示:

用户输入--->视图--->控制器--->模型

站点输出

通过我计划的实现,我希望我的数据库中的每个表都有一个模型,并且每个模型都将具有管理该表所需的所有功能/逻辑。反过来,这些模型中的每一个都将具有关联的视图。模型和视图当然会有一个控制器,允许它们被使用。

现在这很容易让我理解,因为每个需要数据库的单个逻辑操作都已涵盖。但是,当特定操作需要使用多个表/模型时会发生什么?

应用程序的管理端可能一次不需要多个模型来维护数据库。应用程序的前端或用户端是另一回事!假设我有一个网页,其中显示特定部分的文章列表、当前登录用户列表以及 - 借用 SO 中的一个示例 - 网站统计信息,例如标签云。

在我计划的设计中,这一页至少需要 3 个模型——文章、用户和标签。

显然我的单控制器不会削减它。那我该怎么办?

  1. 为我的网页创建新的单体控制器?

    • 让我得到我想要的结果
    • 需要大量重复编码
    • 如果需要更改,真的很难维护
  2. 创建一个操纵较小的特定控制器的“超级”控制器

    • 让我得到我想要的结果
    • 将是模块化的,因此对一个脚本的更改不应影响其他脚本
    • 最少的代码重复
  3. 创建 [在此处插入出色的解决方案]

我目前对选项 2 犯了错误。仅仅是因为理论上它应该减少编码,因为所有必要的行为都将存在于较小的控制器中 - 并且一切都将易于维护。

也许它看起来像这样:

articlecontroller.php

<?php
    //Article Controller Script

    if($_GET['article'] = 'foo')
    {
        //magic necessary for displaying article "foo".
    }
?>

usercontroller.php

<?php
    //User Controller Script

    if($_GET['user'] = 'display')
    {
        //magic necessary for displaying users
    }
?>

supercontroller.php

<?php
    //"Super" Controller

    //magic for setting up page

    if(isset($_GET['article']))
    {
        include('articlecontroller.php');
    }

    if(isset($_GET['user']))
    {
        include('usercontroller.php');
    }
?>

如您所见,我的超级控制器会查看特定页面的要求,并包含完成繁重工作的必要控制器。 注意:代码只是一个快速而肮脏的例子:)

但是,我绝不是专业人士,所以这就是我问你的原因,所以。哪个选项是首选?如果两者都没有,你会建议什么选项 3?任何代码 sn-ps/examples 都可以,但不是必需的。

如果您能做到这一点,感谢您的宝贵时间。


我想我会更新这个问题 [并接受答案 - 忘了这样做 :P]。我看了一下 Fat Models/Skinny Controllers 的概念,我喜欢它的实现方式,所以我一定会按照这个方向发展。

我还参考了其他一些框架以及它们如何实现其 MVC 模式的建议。有很多东西可以吸收!尽管如此,我还是在此过程中学到了很多新东西,因此受益匪浅。将来我可能会有更多问题,但现在我已经足够开始了。

感谢大家的意见。

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

    我不同意您希望在模型中采用的方向。从长远来看,1 个模型 = 1 个表的设计会伤害您。

    首先,我认为您需要放弃模型 == 数据库的严格概念。虽然这通常是正确的,但实际上模型只是数据——它可能来自 XML 文件、缓存,甚至是 Web 服务。

    查看Bill Karwinthis excellent answer - 它很好地解决了这些问题。

    其次,阅读fat models, skinny controllers(或thin controllers)的主题

    最后,就像仅供参考一样,您对“超级控制器”的想法通常被称为“前端控制器”

    【讨论】:

    • 由于它是一个如此小的框架,1 模型 = 1 表在大多数情况下运行良好。但是我不会完全限制自己,因为我知道有些模型需要不止一张桌子。我花了一点时间阅读一个名叫 Tony Marston 的人的文章,他开发了自己的 PHP 框架 - www.radicore.org。他提倡使用 1 Model = 1 Table,正是他的想法影响了我自己的设计。这并不是说他是唯一的方法,但他确实有一个非常强大的框架,并且是一个了解他的东西的人。
    • 我正在阅读他页面上的一些信息,我认为您误解了他对模特的意图。这是他在 MVC 页面上的一句话“模型是表示数据甚至活动的对象,例如数据库表甚至是一些工厂车间生产机器过程。”
    • 哦,别误会我的意思。我知道他不仅仅坚持“每桌一个模型”,但如果你继续探索它确实会突出。无论哪种方式,正如我已经说过的那样,我不打算严格坚持使用 1 个模型/1 个表,但是这样做确实有意义,我认为这样做没有任何问题。
    【解决方案2】:

    您真的应该看看那里的 PHP MVC 框架。他们已经弄清楚了所有这些东西。他们将拥有 URL 路由 (/article/edit/1)、良好的 MVC 分离和出色的文档来帮助您完成它。因此,您不必担心如何从控制器调用视图,而可以考虑您的应用程序。当我最终潜水时,我个人节省了 时间。

    还有很多其他的。

    从头开始创建 PHP MVC 框架可能并不值得。如果您一心想重新发明轮子,那么您至少应该看看这些框架中的设计考虑因素,以获得灵感。

    【讨论】:

    • 啊,我没想到要看看其他框架如何实现这一点。是时候弄脏我的手并开始挖掘了!至于创建自己的框架,只是个人项目,看能不能做。即使它分崩离析,我也应该在此过程中学到很多东西。 :)
    【解决方案3】:

    创建自己的框架非常适合学习更多关于设计模式、oop 设计以及更多关于 php 的知识。

    但是按照 Byron 的建议去做,查看一些 mvc 框架的源代码,只是为了了解它们是如何实现 mvc 模式的。 从 zend 框架中获取一些东西,然后从 cakephp 中获取一些东西,最后你会得到一些对你有用的东西,你也会学到一些东西(注意:不要复制代码,只是想出一个主意!!)

    你的超级控制器想法没问题,但是超级控制器应该将查询字符串作为参数读取(检查 Zend 和其他人的 .htaccess 以了解他们如何执行此操作),以便它可以将第一个参数视为控制器,其余的作为该控制器的参数。

    祝你好运!

    【讨论】:

    • 我发现像 CodeIgniter 和 MicroMVC 这样的小型 MVC 确实有助于了解 MVC 如何在没有大型框架开始添加的所有额外垃圾的情况下工作。然后,一旦你把它弄下来,你就可以开始更复杂的框架实现。但就像你说的,在你尝试构建自己的框架之前,一定要测试一些框架!它将为您节省大量工作!
    • 我还没有接近实现我的控制器将如何工作的细节,所以我给出的示例代码只是一个非常快速的、我头脑中的例子我开始了。话虽如此,谢谢你的提示:)
    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 2015-09-21
    • 1970-01-01
    • 2023-04-01
    • 2015-10-31
    • 1970-01-01
    • 2020-04-26
    • 2019-04-18
    相关资源
    最近更新 更多