2010-11-03 6 views
10

Cuando ejecuto doctrine orm:validate-schema, aparece una serie de advertencias acerca de que mis columnas asignadas son públicas y no utiliza métodos getter/setter para envolverlas. Dice que "rompen la carga floja". Puedo entender cómo hacer público colecciones público podría ser problemático (hago esto privado y envolverlos), pero ¿cómo es esto un problema para los campos en el objeto? Los campos están cargados en su totalidad, que yo sepa.¿Cómo pueden los campos públicos "romper la carga diferida" en Doctrine 2?

+5

Honestamente, no podía creer que esto sea hasta que me di cuenta: La doctrina es una biblioteca de Java. Si se concentraron en hacer el mejor uso posible de las expresiones idiomáticas de PHP en lugar de forzarte a utilizar las "mejores prácticas" diseñadas con otro lenguaje en mente, quizás el rendimiento no sea tan abismal. Estoy de acuerdo en principio con el argumento para getters y setters, pero en un lenguaje interpretado donde lo único que hacen es proxy un campo público, son un innecesario desperdicio de recursos. – Shabbyrobe

+2

@Shabbyrobe: Gracias. Básicamente has dicho lo que he estado pensando todo este tiempo. Doctrine es básicamente un clon de Hibernate. Lo que PHP necesita es algo más que un clon de Active Record. – ryeguy

+8

Doctrine 2 e Hibernate son implementaciones del patrón de mapeador de datos agnóstico de plataforma, pero reconozco la manera en que Doctrine 2 lo ha implementado. Utiliza demasiados modismos de Java, como "captadores y definidores para absolutamente todo, sin preguntas". PHP es un lenguaje interpretado: ¿por qué agregar métodos que esencialmente no hacen nada cuando tienen un impacto negativo medible en el rendimiento? He delineado algunos de mis argumentos en contra de la posición "captar y establecer para todo" [aquí] (http://stackoverflow.com/questions/808348/is-it-really-that- wrong-not-using-setters- and-getters/813099 # 813099). – Shabbyrobe

Respuesta

13

Voy a dar una oportunidad a esto, aunque ciertamente no soy un experto en Doctrine2.

De mi (limitado) uso y prueba parece que Doctrine puede darle un objeto relacionado sin cargar los datos para ese objeto. En ese punto, las propiedades públicas romperán la carga diferida.

Doctrine es la carga lenta en el punto donde se solicitan los datos persistentes, no cuando se solicita el objeto que contiene datos persistentes.

Actualización: Eché un vistazo a actual proxy code y parece que mi comprensión original era en su mayoría correcta. El objeto proxy no se carga hasta que se llame a un método del objeto. Por lo tanto, cualquier solicitud a una propiedad pública no cargaría los datos.

+0

Sí, esto tiene todo que ver con cómo se llaman los proxies. –

+1

Caray, eso es molesto. Gracias por tu investigación. – ryeguy

+1

@ryeguy Quizás, pero parece un mejor método que algunas alternativas. Si implementa la carga diferida cuando se solicita el objeto persistente (en lugar de cuando se usa *), de alguna manera el ORM tiene que poner código entre la propiedad que contiene el objeto relacionado y cualquier código que intente usar esa propiedad (incluida la entidad) el objeto mismo). Eso haría que la carga perezosa sea mucho menos transparente. –

9

Tenga en cuenta que Doctrine 2.4 ahora supports proxy objects for entites with public properties.

Marco Pivetta 's sitio web explica how it works:

class Customer { 
    public $name; 
    public $surname; 
} 

class CustomerProxy extends Customer { 
    public function __construct(Customer $customer) { 
     unset($this->name, $this->surname); 
     $this->customer = $customer; 
    } 
    public function __set($name, $value) { 
     $this->customer->$name = $value; 
    } 

    public function __get($name) { 
     return $this->customer->$name; 
    } 
    // __isset, __unset, __clone, __sleep, __wakeup (or serialize/unserialize) 
} 
+1

+1 para la presentación –

+1

¿Significa esto que podemos ignorar 'vendor/bin/doctrine orm: validate-schema' quejándose de las propiedades públicas? –

+0

@ErikvanVelzen Supongo que sí, no sabía que esta herramienta se quejaba de las propiedades públicas, ¡tal vez debería presentar un problema para que se elimine esta característica desactualizada! – Benjamin