Substituindo methods de instância Doctrine_Record (sfDoctrineRecord) em Doctrine PHP Symfony

Meu plano de fundo está em Propel, então eu estava esperando que seria uma coisa simples replace um getter mágico em um Doctrine_Record (sfDoctrineRecord), mas eu estou obtendo um Segfault ou o método override é simplesmente ignorado em favor daquele no superclass.

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; } } 

Qual é a maneira correta de Doctrine de estender / replace methods em uma instância do Doctrine_Record (via sfDoctrineRecord extends Doctrine_Record)? Isso deve ser acessível … ou devo estar a ver a documentação do modelo?

Obrigado Brian

Tente os methods _get e _set.

Não tenho certeza sobre o que você queria fazer exatamente , mas aqui estão algumas dicas:

  1. Doctrine (com ATTR_AUTO_ACCESSOR_OVERRIDE atributo habilitado, que é habilitado pelo symfony) permite que você substitua os getters de determinadas colunas de componentes apenas definindo os methods getColumnName na class do modelo. É por isso que o seu método getDisplayName pode ser um loop infinito que geralmente causa segfault.

  2. Para acessar / modificar o valor da coluna diretamente (ignorando o costume (get | set) ters), você deve usar os methods _get('column_name') e _set('column_name') definidos pela class Doctrine_Record .

  3. Todas as $obj->getSomething() , $obj->something e $obj['something'] são realmente mágicas. Eles são “redirecionados” para $obj->get('something') que é apenas uma maneira real de acessar os dados do modelo.

Isso funciona:

 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; } } 

Configure Doctrine:

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

então:

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