2010-04-06 4 views
8

Mi fondo está en Propel, así que esperaba que fuera una cosa simple anular un getter mágico en un Doctrine_Record (sfDoctrineRecord), pero estoy obteniendo un Segfault o el método de anulación simplemente se ignora a favor de uno en la superclase.Anulación de Doctrine_Record (sfDoctrineRecord) métodos de instancia en Doctrine PHP Symfony

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; 

    } 

} 

Cuál es la forma Doctrina adecuado para ampliar los métodos/override en una instancia de Doctrine_Record (a través de sfDoctrineRecord extiende Doctrine_Record)? Esto tiene que ser factible ... ¿o debería estar mirando la documentación de la Plantilla?

Gracias, Brian

Respuesta

7

_GET Probar y _ID métodos.

+0

impresionante, gracias. – Brian

8

No estoy seguro de qué quería hacer exactamente, pero aquí hay algunos consejos:

  1. Doctrina (con ATTR_AUTO_ACCESSOR_OVERRIDE atributo enabled, que es permitido por Symfony) le permite anular cierta los captadores de las columnas componentes simplemente definiendo los métodos getColumnName en la clase de modelo. Es por eso que su método getDisplayName puede caer en un bucle infinito que generalmente causa segfault.

  2. para acceder/modificar valor de la columna directamente (sin pasar por encargo (get | set) tros) usted tiene que utilizar _get('column_name') y _set('column_name') métodos definidos por Doctrine_Record clase.

  3. Todas las llamadas a $obj->getSomething(), $obj->something y $obj['something'] son en realidad mágicas. Se "redireccionan" al $obj->get('something') que es solo real manera de acceder a los datos del modelo.

+0

Gracias por la información en ATTR_AUTO_ACCESSOR_OVERRIDE; ahora veo en Doctrine_Record que está marcado antes de devolver el valor del campo. -br – Brian

2

Configurar Doctrina:

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

a continuación:

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

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

¿Funcionará esto si diga Anything = 'test_var'? Estoy tratando de que los métodos getter funcionen con nombres de campo que tienen guiones bajos, pero de alguna manera eso no funciona. ¿Alguna sugerencia? – Shivaas

+0

@Shivaas Pruebe con 'getTestVar' para' test_var' – takeshin

+0

¡Lo intentaré! thx para ayudar. – Shivaas

5

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

    } 

} 
+1

+1 esto funciona perfectamente bien con Doctrine 1.2 – Benoit

Cuestiones relacionadas