我正在使用本教程作为基于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?
答案 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