代码之家  ›  专栏  ›  技术社区  ›  ebonhand

如何用学说yaml模式设置一个自定义的转换器?

  •  3
  • ebonhand  · 技术社区  · 14 年前

    我使用本教程作为基于代码点火器/条令的项目的基础。

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

    我的项目不是像对模型那样使用代码,而是使用一个yaml模式文件来生成模型。

    我遇到了一个障碍,因为我不知道如何用yaml表示以下内容:

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

    (这是来自用户模型代码,在“添加转换器”下) 具体来说,我在$this->hasmutator行遇到了麻烦

    我一直在谷歌搜索直到Blue,搜索文档中的条令,symfony(我知道它大量使用条令),甚至grep'd的代码库中引用了mutators-我发现了空的

    有没有一种方法可以使用学说yaml来表示行$this->hasmutator(“password”,“_encrypt_password”)?

    3 回复  |  直到 13 年前
        1
  •  1
  •   Olof Larsson    14 年前

    (只是要澄清的一点:我们在这里讨论的是条令1.x,而不是条令2.x) 不,没有一种方法可以在yaml模式中直接定义突变。你确定你必须在那里注册变异器吗?

    您可以通过创建自己的理论行为来绕过这个限制。条令行为可以在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]
    
        2
  •  0
  •   ebonhand    14 年前

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

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

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

    我将Olof的答案标记为正确/可接受,因为他的解决方案更具可扩展性,而且我的“闻起来”有点“臭味”。

        3
  •  0
  •   Mark Karwowski    13 年前

    如果从yaml文件加载数据,那么有一件很重要的事情需要注意。

    如在 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
    
    推荐文章