zend-framework - Zend 框架 : Models, 映射器;映射器中的默认字段和模型中的字段操作?

标签 zend-framework orm model datamapper

我正在 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_UserMapper_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 the Model_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/

相关文章:

php - Zend_Db 嵌套查询,其中一个查询需要另一个查询的 ID

node.js - 你知道 Node js 中的任何像 activerecord 和建模系统这样的 Yii

java - 使用 hibernate 而不映射到特定类

python - 我如何从 django 中的博客和评论中复制?

asp.net-mvc - 如何使用 DataAnnotations 进行 ASP.NET MVC 模型验证,其中 ViewModel 包含来自外部 Web 服务的对象?

python - 在 SqlAlchemy 中使用模型类类型的数组创建列

php - JavaScript 返回 "is not a function"错误,但该方法在 Firebug 的响应中列出

php - 如何改变 Zend_Form_Element_Submit 的值

php - Zend 框架 2 : not able to send desired status code in response

sql - 在 ORACLE IN 子句中使用元组和元组中一个元素的条件