我一直在使用Zend的MVC结构一段时间,但到目前为止,我的模型仅限于反映我的个人数据库表。在编写模型以反映更复杂的结构(例如,多对多关系数据库)时,我不确定从何处开始。关于如何设计更复杂的模型,是否有人知道任何好的资源/教程(最好是在线,但书籍建议也很受欢迎)?
答案 0 :(得分:0)
尽管MVC在网络上是一种非常普遍的开发模式,但是当你进入复杂的结构时,我们会遇到一个名为阻抗的设计问题。
阻抗是使用不同功能模型时出现的开销。例如,OOP编程比数据库中使用的普通结构的限制要少得多 - 您可以组合和聚合对象。为了在数据库上执行此操作,您需要一个N:N关系表。
大多数框架中的当前解决方案是在模型中使用has_many和belongs_to属性。这解决了他的问题,但开销出现了(很多对象,大量的简单查询......)。
对于许多开发人员来说,这听起来很疯狂但是:重写你的模型。
这样做可以使组合/聚合工作变得更容易。由于PHP 5.2+支持某些类型转换(对象和数组),您可以使用它来编写模型:
<?php
class Photo extends Model {
private $id;
private $src;
private $description;
}
class Employee extends Model {
private $id
private $name;
private $age;
private Photo $photo;
}
$x = new Employee(123);
echo $x->photo->description;
?>
答案 1 :(得分:0)
听起来你已准备好进行另一层抽象。这是一个3层系统:
请注意,此分层体系结构与您的演示文稿框架的其余部分不同。你仍然应该有一个模板系统,你的应用层将实现它;业务和数据层仅处理数据。这种技术集中了业务逻辑,允许您尽可能少地交换其他层。 (这并不容易,但只是简单。)
请参阅here,了解有关延伸超出当前方法的一些信息。并且,请参阅here了解有关业务逻辑层的一些策略。他们没有谈论单独的数据层,但这仍然是我的建议。
要详细说明增加的代码可维护性的净效果,使用这个系统,你可以实际更改db(MySQL到Postgre仍然是痛苦的,但可能)并且只需要更改一层代码。此外,这种技术是PHPBB等应用程序如何能够支持多个数据库引擎,但使用尽可能多的相同逻辑和表示代码。它还允许您交换UI并创建另一个与实现所有业务逻辑的业务对象交互的UI,与视图后面的控制器逻辑分开。