Переопределяющие методы экземпляра записи доктрины (Sfdoctrinerecord) в Symfony PHP доктрины


Мой опыт работы в 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_record (через sfDoctrineRecord расширяет doctrine_record)? Этот должно быть выполнимо... или я должен смотреть документацию по шаблону?

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

Author: Brian, 2010-04-06

4 answers

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

 7
Author: Tyaga, 2010-04-06 19:17:12

Не уверен, что именно вы хотели сделать , но вот несколько советов:

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

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

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

 8
Author: develop7, 2010-04-06 20:16:39

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

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;

  }

}
 5
Author: Brian, 2010-04-06 21:12:42

Настройка доктрины:

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

Затем:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
 2
Author: takeshin, 2010-04-06 20:01:32