我前一段时间问过这个问题,但现在我正在寻求实现数据库访问层和域层之间的实际分离.我也将努力将业务逻辑移动到它所属的域和控制器脚本之外.
我正在使用Zend Framework为数据访问层实现表数据网关和行数据网关模式,但显然无法真正定义如何构建与数据访问层分离的域层.我考虑过使用Active Record模式,其中域逻辑与数据访问逻辑共存,但我有以下情况至少发生一次,我认为Active Record不会处理:
我有一个表"Person",其中包含person_id和userType字段.
每个userType(admin,buyer,associate,supervisor)都具有与之关联的特定业务逻辑,所有类型都从Person对象继承一些基本功能.
我不想使用专门属于一种类型用户的业务逻辑来膨胀Row Data Gateway对象,但我不确定如何构造域层来表示不同类型的用户.例如,我是否创建一个包含PersonGateway对象的Person对象,然后编写将调用传递给网关对象的包装函数,或者编写Person对象以扩展PersonGateway对象,然后只实现我需要的特定函数?
同样,我通常认为这是(部分)工厂问题,我需要一个工厂方法,它将基于userType实例化正确的子类.这仍然是Zend Framework的Zend_Db类中最好的方法吗?
任何有关如何在Zend_Db上正确创建域模型的教程的建议或链接将不胜感激.
在过去的几周里,我一直在研究使用PHP的Web应用程序的MVC设计模式.从广义上来看,我理解该模式是如何工作的,以及为什么它是从小型或大型实现任何类型的Web应用程序的一种非常好的方式.
据我了解,我们有3个不同的层,通过控制器相互通信,如下所示:
用户输入--->查看--->控制器--->模型
现场输出<---查看<---控制器<---型号
根据我计划的实现,我希望为我的数据库中的每个表建立一个模型,每个模型将具有管理该表所需的所有函数/逻辑.反过来,这些模型中的每一个都将具有相关的视图.模型和视图当然会有一个允许它们使用的控制器.
现在,我很容易理解需要数据库的每个单一逻辑操作.但是,当特定操作需要使用多个表/模型时会发生什么?
应用程序的管理员端一次不一定需要多个模型来维护数据库.应用程序的前端或用户端是另一回事!假设我有一个网页,显示特定部分的文章列表,当前登录用户列表以及 - 从SO中借用示例 - 站点统计信息,例如标签云.
这一页在我计划的设计中至少需要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)