PHP MVC模型命名规范,应该使用单数还是复数?

4
我想知道创建/命名模型的首选方法是什么?
我的应用程序有一个“User”模型,其中包含有关创建、获取、更新(等等)用户记录的所有相关业务逻辑。
在我的某些控制器中,我可能希望获取多个“User”记录的列表。
在这种情况下,我应该创建一个名为Users的全新模型吗?
我认为有几个选择:
1. 我可以将数据库访问权限提供给控制器,控制器可以查询所有相关用户,然后在循环遍历它们时创建一个User模型对象。(糟糕的做法)
2. 我可以有两个单独的模型,“User”和“Users”。 User对象将处理创建、获取、更新单个记录,而Users对象只对列出所有用户记录非常有用。
我不喜欢像这样做的想法:
$user = new User();
$user->fetchAll();

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

也许我这样想错了,我的“User”模型与数据库中的“users”表相关联,实际上应该从一开始就被命名为“Users”。

你如何处理这个问题?


1
模型是单数的,因为每个应用程序只有一个。它是一层。当你说“models”时,你可能指的是领域对象和领域对象的集合。这篇文章可能会有所帮助。 - tereško
4个回答

6

1

我认为你的想法是正确的。为了保持单一职责,你的User()类不应该涉及到获取和更新表格。它应该只代表一个单一用户,并且它的功能应该直接与此相关。如果你开始将User()函数和表格函数混合在一起,就会破坏单一职责原则。因此,我采用第二种方法,在我使用过的框架中也是如此。

在Zend Framework中,扩展Zend_Db_Table的类处理表格操作,并返回扩展Zend_Db_Table_Row的类。在Zend Framework中,Zend_Db_Table_Row具有savedelete方法,它们回调到表格以进行实际的保存和删除。我认为这符合单一职责原则,因为你将这个职责视为直接与该行相关,而不仅仅是与行分开的模型。但是,你需要两个类,一个是表格类,一个是行类。

在Doctrine中(我对此很陌生,不熟悉高级用法),每个模型代表表中的一行,甚至定义了行中的列。这些行是由Doctrine存储库获取、更新和创建的。如果您需要一个仅针对您的Table的存储库,则可以这样做,但它与User()是一个单独的类。
总之,为了符合单一职责原则,我会让UsersTable()::fetchAll()返回User[]。就个人而言,我希望User能够调用UsersTable来更新或删除行,但这只是个人喜好。

抱歉,我以为我已经说清楚了。Users() 或 UsersTable() 继承自 Zend_Db_Table,而 fetchAll() 或 fetchRow() 返回一个 Rowset,其中包含继承自 Zend_Db_Table_Row 的 User()。如果有问题,请告诉我。 - Gareth Parker

1
你不需要单独的模型来表示单数或复数版本,只需要一个即可。你可以拥有一组用户实例,但那是一个集合(数组),而不是一个“Users”类。
从语义上讲,你可以随意称呼自己的模型,但单数似乎是被接受的规范。
基本上你应该这样考虑,User模型代表一个单一的“用户”,因此你的用户服务/存储库的findAll方法应返回一个单一的用户实体/模型的集合/数组。

-1

过去几天里,我一直在苦思冥想同一个问题。

我宁愿保持单一类,但我想这就是面向对象编程的局限性所在。

如果你只需要一个类,我会选择复数形式,因为用户返回多个用户在语义上没有意义,

我知道这个问题已经有答案了,但我也想发表我的看法:

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接