Переопределение методов экземпляра Doctrine_Record (sfDoctrineRecord) в Doctrine PHP Symfony - PullRequest
8 голосов
/ 06 апреля 2010

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

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

Ответы [ 4 ]

8 голосов
/ 06 апреля 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'), что является всего лишь реальным способом доступа к данным модели.

7 голосов
/ 06 апреля 2010

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

5 голосов
/ 07 апреля 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;

  }

}
2 голосов
/ 07 апреля 2010

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

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

тогда:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...