代码之家  ›  专栏  ›  技术社区  ›  Etzeitet

在MVC PHP Web应用程序中创建和组合控制器

  •  0
  • Etzeitet  · 技术社区  · 16 年前

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

    据我所知,我们有3个不同的层,它们通过这样的控制器相互通信:

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

    站点输出<---视图<---控制器<---模型

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

    现在,当需要数据库的每一个逻辑操作都被覆盖时,这很容易让我想到。但是,当一个特定操作需要使用多个表/模型时会发生什么?

    应用程序的管理端不太可能一次需要多个模型来维护数据库。应用程序的前端或用户端是另一回事!假设我有一个网页,上面显示了一个特定部分的文章列表,一个当前登录用户的列表,以及“从”标签云之类的站点统计数据中借用一个例子。

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

    很明显,我的单控制器不会切断它。那我该怎么办?

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

      • 允许我得到我想要的结果
      • 需要很多重复的编码
      • 如果需要更改,很难维护
    2. 创建一个__super_控制器,用于操作较小的特定控制器

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

    我目前正朝着选项2走去。仅仅因为理论上它应该减少编码,因为所有必要的行为都将存在于较小的控制器中——而且所有的事情都将很容易维护。

    可能看起来像这样:

    文章控制器.php

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

    用户控制器.php

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

    超级控制器.php

    <?php
        //"Super" Controller
    
        //magic for setting up page
    
        if(isset($_GET['article']))
        {
            include('articlecontroller.php');
        }
    
        if(isset($_GET['user']))
        {
            include('usercontroller.php');
        }
    ?>
    

    如您所见,我的超级控制器查看特定页面需要什么,并包括完成咕噜工作的必要控制器。 NB: 代码只是一个快速而肮脏的示例:)

    然而,我决不是一个专业人士,所以这就是我问你的原因,所以。首选哪个选项?如果两者都没有,你会建议什么选项3?任何代码片段/示例都很好,但不是必需的。

    如果你能做到这一点,谢谢你抽出时间。


    我想我会更新这个问题[接受一个答案-忘了做那件事:p]。我看了一下胖型/瘦型控制器的概念,我喜欢它是如何实现的,所以我肯定会朝这个方向努力。

    我还参考了一些其他框架以及它们如何实现MVC模式的建议。有很多事情要做!不过,一路上我学到了不少新东西,所以这对我很有好处。将来我可能会有更多的问题,但现在我已经有足够多的问题可以开始了。

    感谢大家的意见。

    3 回复  |  直到 12 年前
        1
  •  6
  •   Community CDub    8 年前

    我不同意你对模特的看法。从长远来看,1个模型=1个桌子的设计会伤害你。

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

    退房 this excellent answer 通过 Bill Karwin -它很好地解决了这些问题。

    第二,读一些关于 fat models, skinny controllers (或) thin controllers )

    最后,正如更多的Fyi一样,你的“超级控制器”的概念是更常见的“前端控制器”。

        2
  •  2
  •   Byron Whitlock    16 年前

    您真的应该看看外面的PHP MVC框架。他们已经把这些事情都弄清楚了。他们将有URL路由(/article/edit/1),良好的MVC分离,以及优秀的文档来帮助您完成它。因此,您可以考虑应用程序,而不是担心如何从控制器调用视图。我个人救了 我终于开始跳水了。

    还有很多其他的。

    从头开始创建一个php-mvc框架可能不值得这么做。如果你已经下定决心要重新设计轮子,那么你至少应该看看这些框架中的设计考虑,以获得灵感。

        3
  •  1
  •   AntonioCS    16 年前

    创建自己的框架对于了解更多关于设计模式、OOP设计和更多关于PHP的知识都是很好的。

    但是按照拜伦的建议去做,并查看一些MVC框架的源代码,只是为了了解它们是如何实现MVC模式的。 从zend框架中获取一些东西,然后从cakephp中获取一些东西,最后,您将得到一些对您有用的东西,并且您还将学到一些东西(注意:不要复制代码,只需获得一个想法!!)

    您的超级控制器想法是可以的,但是超级控制器应该将查询字符串作为参数读取(检查zend和其他控制器的.htaccess以了解它们是如何进行的),这样它可以将第一个参数作为控制器,其余参数作为该控制器的参数。

    祝你好运!!

    推荐文章