Как установить пользовательский мутатор с помощью Doctrine YAML Schema? - PullRequest
3 голосов
/ 28 ноября 2010

Я использую это руководство как основу для проекта на основе Code Igniter / Doctrine.

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

Вместо того, чтобы использовать код как есть для моделей, мой проект использует файл схемы YAML для генерации моделей

Я столкнулся сЗагвоздка в том, что я понятия не имею, как представить следующее с помощью YAML:

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

(это из кода модели пользователя, в разделе «Добавление мутаторов») В частности, у меня возникли проблемы сстроку $ this-> hasMutator

Я гуглил до синего цвета, искал документацию по Doctrine, symfony (я знаю, что интенсивно использую Doctrine) и даже grep'd кодовую базу для ссылок на мутаторы - я пришелвверх пусто

Есть ли способ представить строку $ this-> hasMutator ('password', '_encrypt_password');используя Doctrine YAML?

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

(Просто примечание, чтобы уточнить: мы говорим о Doctrine 1.x здесь, а не Doctrine 2.x) Нет, нет способа определить мутаторы непосредственно в вашей YAML-схеме. Вы уверены, что должны зарегистрировать мутатор там?

Вы можете обойти это ограничение, создав собственное учение. Поведение доктрины может быть назначено вашим моделям в схеме YAML. Подробнее здесь:

http://www.doctrine -project.org / проекты / ОРМ / 1,2 / документы / руководство / поведения / пл

В вашем случае поведение будет выглядеть примерно так:

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

    public function _encrypt_password
    ....
}

А в вашей yaml-схеме:

EbonhandsModel:
  actAs: [EbonhandsTemplate]
0 голосов
/ 07 января 2012

Есть одна важная вещь, о которой нужно помнить, о мутаторах, когда вы загружаете данные из файлов YAML.

Как и в учебном пособии , вы упомянули, что ваш класс пользователя имеет вид:

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, сначала убедитесь, что вы загружаете поле соли, как показано ниже:

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
0 голосов
/ 04 декабря 2010

В итоге я решил эту проблему, добавив новый метод в сгенерированную модель User.php следующим образом:

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

Он достигает того же конечного результата, что и учебное пособие, связанное выше (например, позволяет изменять пользователясмоделировать схему через YAML без потери кода), но не такой элегантный или универсальный.

Я отмечаю ответ Олофа как правильный / принятый, так как его решение кажется более расширяемым, а ОО - моими "запахами""немного

...