Переопределение методов экземпляра Doctrine_Record (sfDoctrineRecord) в Doctrine PHP Symfony

Мой опыт работы с Propel, поэтому я надеялся, что переопределить магический геттер в Doctrine_Record (sfDoctrineRecord) будет просто, но я получаю либо Segfault, либо метод переопределения просто игнорируется в пользу того, что в суперкласс.

https://gist.github.com/697008eaf4d7b606286a

class FaqCategory extends BaseFaqCategory
{

  public function __toString()
  {
    return $this->getCategory();
  }

  // doesn't work
  // override getDisplayName to fall back to category name if getDisplayName doesn't exist
  public function getDisplayName() {

    // also tried parent::getDisplayName() but got segfault(!)
    if(isset($this->display_name)) {
      $display_name = $this->display_name;
    } else {
      $display_name = $this->category;
    }

    return $display_name;

  }

}

Каков правильный способ Doctrine для расширения/переопределения методов экземпляра Doctrine_Record (через sfDoctrineRecord расширяет Doctrine_Record)? Это должно быть выполнимо... или я должен смотреть документацию по шаблону?

Спасибо, Брайан


person notbrain    schedule 06.04.2010    source источник


Ответы (4)


Попробуйте методы _get и _set.

person Tyaga    schedule 06.04.2010

Не знаю, что вы хотели сделать точно, но вот несколько советов:

  1. Doctrine (с включенным атрибутом ATTR_AUTO_ACCESSOR_OVERRIDE, который включен в symfony) позволяет вам переопределять геттеры определенных столбцов компонентов, просто определяя методы getColumnName в классе модели. Вот почему ваш метод getDisplayName может привести к бесконечному циклу, который обычно вызывает segfault.

  2. Для прямого доступа/изменения значения столбца (в обход пользовательских (get|set)теров) вы должны использовать методы _get('column_name') и _set('column_name'), определенные классом Doctrine_Record.

  3. Все вызовы $obj->getSomething(), $obj->something и $obj['something'] на самом деле волшебные. Они "перенаправляются" на $obj->get('something'), что является единственным реальным способом доступа к данным модели.

person Andrei Dziahel    schedule 06.04.2010
comment
Спасибо за информацию об ATTR_AUTO_ACCESSOR_OVERRIDE; теперь я вижу, где в Doctrine_Record проверяется перед отправкой значения поля. -br - person notbrain; 07.04.2010

Это работает:

class FaqCategory extends BaseFaqCategory
{

  public function __toString()
  {
    return $this->getCategory();
  }

  public function getDisplayName() {

    if($this->_get("display_name") != "") {
      $display_name = $this->_get("display_name");
    } else {
      $display_name = $this->getCategory();
    }

    return $display_name;

  }

}
person notbrain    schedule 06.04.2010

Настроить доктрину:

$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 

тогда:

public function getAnything()
{
    return $this->_get('anything');
}

public function setAnything()
{
    return $this->_set('anything', $value);
}
person takeshin    schedule 06.04.2010
comment
Будет ли это работать, если сказать Anything = 'test_var'? Я пытаюсь заставить методы получения работать с именами полей, которые имеют символы подчеркивания, но почему-то это не работает. Какие-либо предложения? - person Shivaas; 11.01.2011
comment
@Shivaas Попробуйте с getTestVar для test_var - person takeshin; 11.01.2011