PHP MVC模型命名约定,单数/复数?

时间:2014-05-07 04:37:18

标签: php naming-conventions inflection

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

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

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

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

我看到它的方式,有几个选择:

  1. 我可以给控制器提供数据库访问权限,控制器可以查询所有相关用户,然后在循环访问时创建用户模型对象。 (BAD)

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

  3. 我不喜欢这样做的想法:

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

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

    也许我正在以错误的方式思考这个问题,而我的“用户”模型(与数据库中的“用户”表相关)应该从一开始就被命名为“用户”。

    你如何处理这个问题?

4 个答案:

答案 0 :(得分:4)

嗯,试着保持一致我猜... 对我来说,我将使用User模型与表User进行交互,所以我并不关心我将与之交互的记录数量。

请检查此问题:going to build a php MVC, what naming conventions do i need to be aware of?

答案 1 :(得分:2)

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

在Zend Framework中,扩展Zend_Db_Table的类处理表操作,并返回扩展Zend_Db_Table_Row的类。在Zend Framework中,Zend_Db_Table_Row有一个savedelete方法,它会回调该表以进行实际的保存和删除。我认为这与唱歌责任保持一致,因为您认为直接对该行负责,而不仅仅是与行分开的模型。不过,你有两节课。表类和行类

在Doctrine中(我对此不熟悉,所以我不熟悉高级用法),每个模型代表表中的一行,甚至可以定义行中的列。这些行由Doctrine Repository提取和更新并创建。如果您只需要一个适用于您的表的存储库,那么您可以这样做,但它是User()

的单独类

总而言之,为了与单一责任保持一致,我UsersTable()::fetchAll()返回User[]。就个人而言,我User可以致电UsersTable来更新或删除该行,但这只是个人偏好。

答案 2 :(得分:1)

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

你可以在任何你想要的语义上调用你的模型,但是,单数似乎是公认的标准。

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

答案 3 :(得分:0)

过去几天,我因为同一件事一直在撞墙。

我本人希望自己只上一堂课,但我想这是OOP可能会受到轻微限制的地方。

我想说的是,如果您只想要一个类,那么我会选择Plural,因为对于用户返回多个用户来说,语义上没有意义,

我知道这个问题已经得到解决,但是我会捐出2美分:

ORDER BY 
    TO_NUMBER(REGEXP_SUBSTR(ID_Col, '^S\d+$')), 
    ID_Col 

    /* gives ORA-01722: invalid number */