我想知道创建/命名模型的首选方法是什么?
我的应用程序有一个“用户”模型,其中包含用于创建,获取,更新(等)用户记录的所有相关业务逻辑。
在某些控制器中,我可能想要获取多个“用户”记录的列表。
在这种情况下,我应该创建一个名为Users的全新模型吗?
我看到它的方式,有几个选择:
我可以给控制器提供数据库访问权限,控制器可以查询所有相关用户,然后在循环访问时创建用户模型对象。 (BAD)
我可以有两个单独的模型,“用户”和“用户”。用户对象将处理创建,获取,更新单个记录,而用户对象实际上只对列出所有用户记录有用。
我不喜欢这样做的想法:
$user = new User();
$user->fetchAll();
纯粹出于语义原因。在我看来,User对象应该只涉及一个用户记录。
也许我正在以错误的方式思考这个问题,而我的“用户”模型(与数据库中的“用户”表相关)应该从一开始就被命名为“用户”。
你如何处理这个问题?
答案 0 :(得分:4)
请检查此问题: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
有一个save
和delete
方法,它会回调该表以进行实际的保存和删除。我认为这与唱歌责任保持一致,因为您认为直接对该行负责,而不仅仅是与行分开的模型。不过,你有两节课。表类和行类
在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 */