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

Мое образование находится в, Продвигают, таким образом, я надеялся, что это будет простая вещь переопределить волшебный метод считывания в 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)? Это должно быть выполнимо..., или я должен смотреть на Шаблонную документацию?

Спасибо, Brian

8
задан Brian 6 April 2010 в 18:35
поделиться

4 ответа

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

7
ответ дан 5 December 2019 в 07:34
поделиться

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

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

затем:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
2
ответ дан 5 December 2019 в 07:34
поделиться

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

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
ответ дан 5 December 2019 в 07:34
поделиться

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

  1. Doctrine (с включенным атрибутом 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
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: