我正在 Zend Framework 中创建一个简单的 ORM,以使用 DbTable/Mapper/Model 方法粗略地封装一个公共库应用程序。不过,我不确定我执行与用户相关的课程的方式是否正确,因为我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');
}
}
?>