【发布时间】:2012-09-02 14:38:19
【问题描述】:
我正在 Zend Framework 中创建一个简单的 ORM,以使用 DbTable/Mapper/Model 方法粗略地封装一个公共库应用程序。不过,我不确定我执行与用户相关的课程的方式是否正确,因为我在Mapper_User 中有一些逻辑,在Model_User 中有一些逻辑。
Mapper_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一个表格,然后设置一些对象属性,例如注册日期,“一次允许的最大书籍”等。该数据由Mapper_User 填充到Model_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);。同样,这感觉正确 - 如果 Model_User 是从数据库中提取的,尝试在 Mapper_User->save(); 方法中执行 md5 步骤会导致问题,因为密码字段显然已经被散列。
这就是我困惑的地方。在我看来,与“与用户有关的字段”有关的所有逻辑都应该存在于它的模型或映射器中,但是在这里我在映射器中有一些逻辑(默认字段),还有一些(字段操作)在模型。 这是对的,还是我应该尝试以某种方式获取模型中的默认字段,或映射器中的字段操作?
感谢您抽出宝贵时间阅读本文!
编辑@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');
}
}
?>
【问题讨论】:
-
如果您发布一些代码来演示会有所帮助,我想我明白了,但我不确定。
-
@RockyFord 认为没有它会更整洁,但我会添加一些!
-
我正在努力寻找答案,但如果不了解您的想法和编码方式,我不知道从哪里开始。
-
谢谢@RockyFord,我真的很感激 - 添加了两个有问题的代码块的一些代码示例,这是否有助于了解我在做什么正确/错误?
-
我现在就告诉你,setPassword() 中的散列不会长时间工作。你如何 __construct() 你的映射器?
标签: zend-framework orm model datamapper