首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Doctrine YAML Schema设置自定义赋值函数?

如何使用Doctrine YAML Schema设置自定义赋值函数?
EN

Stack Overflow用户
提问于 2010-11-28 18:06:38
回答 3查看 1.2K关注 0票数 3

我正在使用这个教程作为一个基于Code Igniter / Doctrine的项目的基础。

http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-3-user-signup-form

我的项目使用YAML模式文件来生成模型,而不是按原样使用代码

我遇到了一个问题,因为我不知道如何使用YAML来表示以下内容:

代码语言:javascript
复制
$this->hasMutator('password', '_encrypt_password');

(这段代码来自用户模型代码,在“添加修改器”下)具体地说,我在使用$this->hasMutator行时遇到了问题

我已经用谷歌搜索了Doctrine,symfony (我知道它大量使用Doctrine )的蓝色搜索文档,甚至在代码库中grep了对修改器的引用-我什么也没有找到

有没有办法用Doctrine YAML来表示行$this->hasMutator('password','_encrypt_password');?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-04 00:20:42

(只需要说明一下:我们在这里讨论的是Doctrine 1.x,而不是Doctrine 2.x)不,没有一种方法可以直接在YAML模式中定义修改器。您确定必须在那里注册赋值函数吗?

你可以通过创建自己的教条行为来绕过这个限制。理论行为可以在YAML模式中分配给您的模型。点击此处阅读更多信息:

http://www.doctrine-project.org/projects/orm/1.2/docs/manual/behaviors/pl

在您的示例中,行为将如下所示:

代码语言:javascript
复制
class EbonhandsTemplate extends Doctrine_Template
{
    public function setUp()
    {
        $this->hasMutator('password', '_encrypt_password');
    }

    public function _encrypt_password
    ....
}

在您的yaml模式中:

代码语言:javascript
复制
EbonhandsModel:
  actAs: [EbonhandsTemplate]
票数 2
EN

Stack Overflow用户

发布于 2010-12-04 15:06:12

我最终通过向生成的User.php模型添加一个新方法来解决这个问题,如下所示:

代码语言:javascript
复制
public function setPassword($pass)
{
  $this->_set('password', $this->_encrypt_password($pass));
}

它实现了与上面链接的教程相同的最终结果(例如,允许在不丢失代码的情况下通过YAML修改用户模型模式),但感觉不是那么优雅或通用。

我将Olof的回答标记为正确/被接受,因为他的解决方案感觉更具可扩展性,而OO -OO的解决方案有点“难闻”

票数 0
EN

Stack Overflow用户

发布于 2012-01-07 16:13:51

如果您从YAML文件中加载数据,那么关于修改器有一件重要的事情需要注意。

正如您在tutorial中提到的,如果您的User类如下:

代码语言:javascript
复制
class User extends ModelBaseUser
{
    public function setUp() {
        parent::setUp();
        $this->hasMutator('password', '_encryptPassword');
    }

    protected function _encryptPassword($value) {
        $salt = $this->_get('salt');
        $this->_set('password', md5($salt . $value));
    }
}

如果您使用loadData()从YAML文件填充数据库,请确保首先加载salt字段,如下所示:

代码语言:javascript
复制
ModelUser:
    User_Admin:
        username: admin
        salt: $secret_
        password: adminPa$$
        email: admin@promosquare.com

而不是:

代码语言:javascript
复制
ModelUser:
    User_Admin:
        username: admin
        password: adminPa$$
        salt: $secret_
        email: admin@promosquare.com
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4296279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档