【发布时间】:2009-07-13 15:49:22
【问题描述】:
在过去的几周里,我一直在研究使用 PHP 的 Web 应用程序的 MVC 设计模式。从广泛的角度来看,我了解该模式的工作原理以及为什么它是实现任何类型的 Web 应用程序(无论大小)的一种非常好的方式。
据我了解,我们有 3 个不同的层,它们通过控制器相互通信,如下所示:
用户输入--->视图--->控制器--->模型
站点输出
通过我计划的实现,我希望我的数据库中的每个表都有一个模型,并且每个模型都将具有管理该表所需的所有功能/逻辑。反过来,这些模型中的每一个都将具有关联的视图。模型和视图当然会有一个控制器,允许它们被使用。
现在这很容易让我理解,因为每个需要数据库的单个逻辑操作都已涵盖。但是,当特定操作需要使用多个表/模型时会发生什么?
应用程序的管理端可能一次不需要多个模型来维护数据库。应用程序的前端或用户端是另一回事!假设我有一个网页,其中显示特定部分的文章列表、当前登录用户列表以及 - 借用 SO 中的一个示例 - 网站统计信息,例如标签云。
在我计划的设计中,这一页至少需要 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 模式的建议。有很多东西可以吸收!尽管如此,我还是在此过程中学到了很多新东西,因此受益匪浅。将来我可能会有更多问题,但现在我已经足够开始了。
感谢大家的意见。
【问题讨论】: