3

我想知道创建/命名模型的首选方法是什么?

我的应用程序有一个“用户”模型,其中包含用于创建、获取、更新(等)用户记录的所有相关业务逻辑。

在我的一些控制器中,我可能想要获取多个“用户”记录的列表。

在这种情况下,我应该创建一个名为 Users 的全新模型吗?

在我看来,有几个选择:

  1. 我可以授予对控制器的数据库访问权限,并且控制器可以查询所有相关用户,然后在我循环访问它们时创建一个用户模型对象。(坏的)

  2. 我可以有两个单独的模型,“用户”和“用户”。用户对象将处理创建、获取、更新单个记录,而用户对象实际上只对列出所有用户记录有用。

我不喜欢做这样的事情的想法:

$user = new User();
$user->fetchAll();

纯粹出于语义原因。在我看来,一个用户对象应该只与一个用户记录相关。

也许我想错了,我的“用户”模型,它与数据库中的“用户”表相关,从一开始就应该真正命名为“用户”。

你如何处理这个问题?

4

4 回答 4

5

嗯,我想尽量保持一致.. 对我来说,我将使用 User 模型与表 User 进行交互,所以我并不关心我将与多少条记录进行交互..

检查这个问题:要构建一个 php MVC,我需要注意哪些命名约定?

于 2014-05-07T04:46:26.343 回答
1

我认为你有正确的想法。为了保持单一职责,您的User()类不应参与表的获取和更新。它应该只代表一个用户,它的功能应该与之直接相关。如果你开始将你的User()函数和表的函数混合在一起,你就打破了单一职责。出于这个原因,我采用第二种方法,这就是它在我使用过的框架中的工作方式

在 Zend Framework 中,扩展类Zend_Db_Table处理表操作,并返回扩展类Zend_Db_Table_Row。在 Zend Framework 中,Zend_Db_Table_Row有一个saveanddelete方法,它回调表来做实际的保存和删除。我认为这与唱责任保持一致,因为您认为该责任直接与该行有关,而不仅仅是与该行分离的模型。不过,你有两个班级。一个表类和一个行类

在 Doctrine 中(我是新手,所以我不熟悉高级用法),每个模型都代表表中的一行,即使定义行中的列也是如此。这些行由 Doctrine Repository 获取、更新和创建。如果您只需要为您的表存储一个存储库,那么您可以这样做,但它是一个单独的类User()

总而言之,为了符合 Single Responsibility,我会使用UsersTable()::fetchAll()return User[]。就个人而言,我User可以调用UsersTable来更新或删除该行,但这只是个人喜好。

于 2014-05-07T05:21:29.707 回答
1

您不需要单独的模型来表示单数或复数版本。只是其中之一。您可以拥有用户实例的集合,但这是一个集合(数组),而不是“用户”类。

实际上,您可以在语义上随意调用您的模型,但单数似乎是公认的规范。

基本上,您应该考虑的方式是用户模型代表单个“用户”,因此您的用户服务/存储库的 findAll 方法应该返回单个用户实体/模型的集合/数组。

于 2014-05-07T05:24:27.500 回答
0

在过去的几天里,我一直在为同样的事情撞墙。

我宁愿自己保留一个班级,但我想这是 OOP 可能会受到轻微限制的地方。

我会说如果你只想要一个类,那么我会选择复数,因为用户返回多个用户没有语义意义,

我知道这已经得到回答,但我会贡献我的 2 美分:

class UserModel
{
    /**
    * @var $user
    */
    public $user;

    function __construct()
    {

    }

    public function get_all()
    {
         //Get all products
    }

    public function get($where)
    {
         //Get user instance here either by:
         $this->user = $result; //Result from SQL Row
         //or:
         return new User($result);
    }
}

class User
{
    public $firstname;
    public $lastname;
    public $somevar;
}
于 2020-03-03T20:57:51.830 回答