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

Etz*_*tet 0 php model-view-controller

在过去的几周里,我一直在研究使用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".
    }
?>
Run Code Online (Sandbox Code Playgroud)

usercontroller.php

<?php
    //User Controller Script

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

supercontroller.php

<?php
    //"Super" Controller

    //magic for setting up page

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

    if(isset($_GET['user']))
    {
        include('usercontroller.php');
    }
?>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的超级控制器会查看特定页面所需的内容,并包含执行繁琐工作所需的控制器. 注意:代码只是一个快速而肮脏的例子:)

但是,我绝不是专业人士所以这就是我问你的原因.哪个选项更受欢迎?如果你不建议选项3?任何代码片段/示例都很可爱但不是必需的.

如果你做到这一点,谢谢你的时间.


我以为我会更新这个问题[并接受答案 - 忘记这样做:P].我看了一下Fat Models/Skinny Controllers的概念,我喜欢它是如何完成的,所以我一定会接受这个方向.

我也接受了建议,看看其他一些框架以及它们如何实现MVC模式.还有很多东西需要考虑!不过,我一路上学到了很多新东西,所以它有很大的好处.我将来可能会有更多问题,但是现在我已经绰绰有余了.

谢谢大家的意见.

Pet*_*ley 6

我不同意你想要在你的模型中采取的方向.从长远来看,1型= 1桌设计会伤害到你.

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

看看这个优秀的答案比尔Karwin -它解决了这些问题非常好.

其次,做一些关于胖模型,瘦控制器(或瘦控制器)主题的阅读

最后,就像更多的FYI一样,你对"超级控制器"的想法更常被称为"前控制器"