我想知道创建/命名模型的首选方法是什么?
我的应用程序有一个"User"模型,它包含了创建、获取、更新(等等)User记录的所有相关业务逻辑。
在我的一些控制器中,我可能想要获取多个"User"记录的列表。
在这种情况下,我是否应该创建一个名为Users的全新模型?
在我看来,有几个选项:
-
我可以给控制器数据库访问权,控制器可以查询所有相关的用户,然后在我循环它们时创建一个User模型对象。(坏的管理者)
-
我可以有两个单独的模型,"用户"one_answers"用户"。User对象将处理创建、获取和更新单个记录,而Users对象实际上只对列出所有User记录有用。
我不喜欢做这样的事情。
$user = new User();
$user->fetchAll();
纯粹出于语义原因。在我看来,一个User对象应该只与一个用户记录相关。
也许我想错了,我的"User"模型,它与数据库中的"users"表相关,从一开始就应该被命名为"users"。
你如何处理这个问题?
嗯,我猜只是试着保持一致…对于我来说,我将使用User模型与表User交互,所以我并不真正关心我将与多少记录交互。
检查这个问题:要建立一个php MVC,我需要知道什么命名约定?
您不需要一个单独的模型来表示单数或复数版本。要么选一个,要么选另一个。你可以有一个用户实例的集合,但那是一个集合(数组),而不是一个"Users"类。
你可以在语义上给你的模型取任何你想要的名字,但是单数似乎是被接受的标准。
基本上,您应该考虑的方式是用户模型代表单个"用户",因此用户服务/存储库的findAll方法应该返回单个用户实体/模型的集合/数组。
我想你的想法是对的。为了保持单一的职责,您的User()
类不应该涉及表的获取和更新。它应该只代表一个用户,它的功能应该直接与之相关。如果你开始将User()
函数和表的函数混合在一起,你就打破了单一职责。出于这个原因,我采用第二种方法,这就是它在我使用过的框架中的工作方式
在Zend框架中,扩展Zend_Db_Table
的类处理表操作,返回扩展Zend_Db_Table_Row
的类。在Zend框架中,Zend_Db_Table_Row
有save
和delete
方法,它们回调表来执行实际的保存和删除操作。我认为这与歌唱责任是一致的,因为你认为责任直接与行有关,而不仅仅是与行分离的一个模型。你仍然有两门课。表类和行类
在Doctrine中(我是新手,所以我不熟悉高级用法),每个模型代表表中的一行,甚至可以定义行中的哪些列。这些行由Doctrine Repository获取、更新和创建。如果你只需要一个Table的存储库,那么你可以这样做,但它是User()
总而言之,为了与单一责任保持一致,我将UsersTable()::fetchAll()
返回User[]
。就我个人而言,我希望User
能够调用UsersTable
来更新或删除行,但这只是个人偏好。
这几天我一直为同一件事绞尽脑汁。
我自己更喜欢保持一个类,但我想这是OOP可能受到稍微限制的地方。
我想说,如果你只想要一个类,那么我会选择复数,因为它没有语义意义的一个用户返回多个用户,
我知道这个问题已经有人回答了,但是我还是要贡献我的意见:
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;
}