如何使用Doctrine YAML Schema设置自定义mutator?

时间:2010-11-28 10:06:38

标签: php codeigniter doctrine yaml

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

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

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

我遇到了麻烦,因为我不知道如何使用YAML代表以下内容:

$this->hasMutator('password', '_encrypt_password');

(这是来自用户型号代码,在“添加Mutators”下) 具体来说,我遇到了$ this-> hasMutator行

的问题

我直到搜索了Doctrine,symfony(我知道严重使用Doctrine)的蓝色搜索文档,甚至为变换器的引用grep了代码库 - 我已经空了

有没有办法代表$ this-> hasMutator('password','_ encrypt_password')行;使用Doctrine YAML?

3 个答案:

答案 0 :(得分:1)

(请注意澄清:我们在这里讨论的是Doctrine 1.x而不是Doctrine 2.x) 不,没有办法直接在YAML架构中定义mutator。你确定你必须在那里注册mutator吗?

您可以通过创建自己的学说行为来解决这个限制。可以在YAML模式中将原则行为分配给模型。在这里阅读更多内容:

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

在您的情况下,行为看起来像这样:

class EbonhandsTemplate extends Doctrine_Template
{
    public function setUp()
    {
        $this->hasMutator('password', '_encrypt_password');
    }

    public function _encrypt_password
    ....
}

在您的yaml架构中:

EbonhandsModel:
  actAs: [EbonhandsTemplate]

答案 1 :(得分:0)

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

public function setPassword($pass)
{
  $this->_set('password', $this->_encrypt_password($pass));
}

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

我将Olof的答案标记为正确/接受,因为他的解决方案感觉更具可扩展性和OO - 我的“闻起来”了一点

答案 2 :(得分:0)

如果从YAML文件加载数据,有一件重要的事情要注意mutators。

正如在tutorial中提到的那样,你的用户类是否像:

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字段,如下所示:

ModelUser:
    User_Admin:
        username: admin
        salt: $secret_
        password: adminPa$$
        email: admin@promosquare.com

而不是:

ModelUser:
    User_Admin:
        username: admin
        password: adminPa$$
        salt: $secret_
        email: admin@promosquare.com