我正在 Zend Framework 中创建一个简单的 ORM,以使用 DbTable/Mapper/Model 方法粗略地封装一个公共(public)库应用程序。不过,我不确定我做用户相关类(class)的方式是否正确,因为我在 Mapper_User
中有一些逻辑。 ,还有一些在 Model_User
.
映射器_用户
<?php
class Mapper_Users {
/*
createModelObject would be called by a Controller handling a Form_Regsiter's
data, to create a new Model_User object. This object'd then be saved by the
same Controller by calling Mapper_Users->save();
*/
public function createModelObject(array $fields) {
if(!isset($fields['date_registered']))
$fields['date_registered'] = date('Y-m-d H:i:s');
if(!isset($fields['max_concurrent_rentals']))
$fields['max_concurrent_rentals'] = 3;
return new Model_User($fields);
}
}
?>
在创建新的方法中
Model_User
从头开始创建对象(例如,不是从数据库中提取记录,而是注册一个新用户),我实例化一个新的 Model_User
使用表单提供的名称/用户名/密码,然后设置一些对象属性,例如注册日期、“一次允许的最大书籍数”等。这些数据被塞进了Model_User
由 Mapper_User
,然后在 Mapper_User->save();
时写入数据库被调用。 Mapper 感觉是适合这个的地方 - 保持模型轻。是这样吗,还是应该在
Model_User
中设置这样的默认字段?本身?模型_用户
<?php
class Model_User {
public function setPassword($value) {
$this->password = md5($value);
}
}
?>
在设置用户对象的密码时,我在
Model_User->setPassword($value);
中执行此操作,正如你所料,并做 $this->password = md5($value);
在这个方法里面。再一次,这感觉不错 - 尝试在 Mapper_User->save();
中执行 md5 步骤如果 Model_User
是从数据库中提取的,因为密码字段显然已经被散列了。这就是我产生困惑的地方。在我看来,与“与用户有关的字段”有关的所有逻辑都应该存在于它的模型或映射器中,但这里我在映射器中有一些逻辑(默认字段),还有一些(字段操作)在模型。这是正确的,还是我应该尝试以某种方式获取模型中的默认字段或映射器中的字段操作?
感谢您抽时间阅读!
编辑@RockyFord:
Mapper_User
实际上扩展了我写的摘要,因为我不喜欢在 500 Mapper_*.php
中编写相同的基本代码文件,因此有一些官僚作风,但其有效的 __construct() 非常简单:<?php
class Mapper_Users {
public function __construct() {
$this->_db = new DbTable_Users();
if(!$this->_db instanceof Zend_Db_Table_Abstract)
throw new Exception('Invalid table data gateway provided');
}
}
?>
最佳答案
DataMapper
负责用对象的数据填充对象,以及持久化它。当你调用 $user->save()
时,你似乎在混淆。因为您将持久性逻辑放在域对象中。这是您使用 ActiveRecord
时的常用方法。模式而不是 DataMappers
,这是一件坏事。
您的 DataMapper
应该负责保存对象$mapper->save($user);
它只需要更新更改的属性。因此,只有您设置了新的哈希值,密码才会更新。
更新:
你说:
[...] trying to do the md5 step in
Mapper_User->save();
method would cause issues if theModel_User
were one pulled from the DB, as the password field would clearly already be hashed.
创建一个名为
setPasswordHash()
的方法并在从数据库中提取时使用它。Remember: Don't look for things!
而不是在你的映射器中寻找数据库,你应该要求它。
public __construct(Zend_Db_Table $dbTable) {
$this->dbTable = $dbTable;
}
这都是关于依赖注入(inject)的。
关于zend-framework - Zend 框架 : Models, 映射器;映射器中的默认字段和模型中的字段操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339665/