php oop MVC设计-适用于编辑数据的应用程序的体系结构

php oop MVC设计-适用于编辑数据的应用程序的体系结构,php,model-view-controller,oop,design-patterns,Php,Model View Controller,Oop,Design Patterns,现在我已经阅读了大量关于OOP、MVC和设计模式的帖子、文章、问题和答案,我仍然对构建我想要构建的东西的最佳方式有疑问 我的小框架是以MVC方式构建的。它使用smarty作为查看器,我将一个类设置为从url调用的控制器 现在我想我迷路的地方是模型部分。我可能将模型和类/对象混合得太多(或太少) 无论如何,这是一个例子。当目标是获取驻留在我的数据库中的用户列表时: 该应用程序由“用户/列表”调用,然后控制器运行函数列表,该函数列表打开类“用户”的实例,并请求该类从表中检索列表。返回控制器后,控制器

现在我已经阅读了大量关于OOP、MVC和设计模式的帖子、文章、问题和答案,我仍然对构建我想要构建的东西的最佳方式有疑问

我的小框架是以MVC方式构建的。它使用smarty作为查看器,我将一个类设置为从url调用的控制器

现在我想我迷路的地方是模型部分。我可能将模型和类/对象混合得太多(或太少)

无论如何,这是一个例子。当目标是获取驻留在我的数据库中的用户列表时:

该应用程序由“用户/列表”调用,然后控制器运行函数列表,该函数列表打开类“用户”的实例,并请求该类从表中检索列表。返回控制器后,控制器通过将结果集(数组)分配给模板并设置模板将其推送到查看器。 然后,用户点击表格中的一行,告诉控件启动“用户/编辑”,例如,这将创建一个表单,并用用户数据填充表单,供我编辑

到目前为止还不错

现在,我将所有这些合并到一个用户类中,这样该类将有一个函数create、getmealitofusers、update等,以及hairType和noseSize等属性。 但正确的oop设计会让我将“用户”(具有诸如登录名、大鼻子、卷发等属性)与“给我一个用户列表”分开,这更像是一个“用户管理器类”

如果我要实现一个用户管理器类,那么应该是什么样子?它应该是一个对象(不能真正将它与现实世界中的事物进行比较)还是一个只有公共函数的类,这样它或多或少看起来像一组函数

它应该返回一个已找到记录的数组(如:
array([0]=>array(“firstname”=>“dirk”、“lastname”=>“diggler”))
还是应该返回一个对象数组


所有这些对我来说仍然有点困惑,我想知道是否有人能给我一些关于如何以最佳方式实现这一点的见解。

处理和数据所需的抽象级别(业务逻辑)取决于您的需要。例如,对于具有的应用程序(您的设计可能就是这样),您描述的从数据库获取和更新数据的类对我来说是有效的

你可以通过使用,甚至是,更一般化一点

如果您觉得自己在事务脚本中复制了大量代码,那么您可能希望使用创建自己的代码。但是,我不会从一开始就盲目地这样做,因为这需要更多的代码才能开始。另外,单独编写数据映射器是不明智的,而是使用现有组件来实现。是吗这是PHP中的一个组件

另一个现有的ORM(对象关系映射器)组件是,它提供活动记录

如果您只是在寻找一种快速查询数据库的方法,您可能会发现这很有启发性


您可以在中找到斜体显示的图案


它列出了书中的所有模式。

我不是这方面的专家,但最近做了几乎完全相同的事情。我设置它的方式是,我有一个类用于几行(
用户
),一个类用于一行(
用户
)。“几行类”基本上只是一个集合(静态)函数,它们用于从表中检索行,如下所示:

$fiveLatestUsers = Users::getByDate(5);
然后,每个用户对象都有检索表中字段的方法(如
$User->getUsername()
$User->getEmail()
等).我以前只返回一个关联数组,但在返回数据之前需要修改数据的情况下会遇到这种情况,在这种情况下,为每个字段创建一个带有方法的类非常有意义

编辑:
用户
对象也有更新和删除当前行的方法

$user->setUsername('Gandalf');
$user->save();
$user->delete();

另一种替代理论和推进的方法是

教条和推进真的是强大的野兽。如果你在做一个较小的项目,我认为你最好用一些较轻的东西

另外,在谈到第三方解决方案时,有很多针对PHP的MVC框架,如:Kohana、Codeigniter、CakePHP、Zend(当然)

它们都有自己的ORM实现,通常是更轻的替代方案

对于Kohana框架,还有一个被认为是非常轻量级的


就我个人而言,我使用的是Doctrine,但这是一个巨大的项目。如果我做的是较小的事情,我会选择较轻的替代品。

另一个替代品是Prope。虽然它是ORM而不是数据映射器。(但它是我最喜欢的;-)另外,Doctrine1也是一个活动记录实现。Doctrine2是数据映射器。对于非常勇敢的人:)您还可以通过Doctrine2数据映射器实现活动记录;)嗯,这取决于很多事情。在web环境中,MVC是一种很好但并非完全确定的设计模式。它有几个变体。就我个人而言,我不喜欢你描述的“脂肪控制器”方面。控制器“应该”用于路由请求和处理GET/POST/SESSION数据。视图应该直接从模型中获取所有内容(如果没有任何特殊的业务逻辑,则强制在控制器中获取)。至于模型分离,我也有同样的问题。最后,为每个实体类创建了一个Repository/Manager类,该类处理所有实体类。我有一个索引文件,决定打开哪个应用程序,该文件处理会话并回显模板。所以我想你也可以把它看作一个控制器。但我倾向于不这样做,因为我的大脑无法处理当时应该是观众和模特的事情;)我认为这确实是一条道路。生成的代码很容易理解