php - example - install doctrine symfony 4
Doctrine 2 ¿Cuál es la forma recomendada de acceder a las propiedades? (6)
Recuerdo haber leído que en los modelos de Doctrine 2, no debería establecer propiedades / campos públicos. ¿Cómo entonces expondrías estos campos? La caja de arena utiliza los métodos get*()
y set*()
. ¿Es esa la mejor idea? Es muy engorroso. El uso de los métodos mágicos __get()
__set()
hará que cosas similares a la configuración de campos sean públicas.
¿Cuál es tu recomendación?
Doctine 2 proporciona una [herramienta de línea de comandos] [1] para generar clases de entidad básicas
use lo siguiente para obtener una definición de clase de entidad básica de su asignación, completa con las funciones de obtención / establecimiento para cada propiedad:
path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/
Aún es responsable de modificar cada captador / configurador para asegurarse de que sean el tipo de datos adecuado, ya que los métodos de captador / definidor generados para la Entidad no realizan ningún tipo de conversión / conversión.
En lugar de tener getters y setters separados, o incluso usar las funciones mágicas ... ¿Hay algún problema con tener algo como esto en la clase?
public function Set($attrib, $value)
{
$this->$attrib = $value;
}
public function Get($attrib)
{
return $this->$attrib;
}
Facilita mucho el acceso a los atributos y significa que se pueden configurar dinámicamente desde matrices de pares de claves ... ¿algún comentario? ¿O sugerencias alternativas?
He aquí por qué no puede usar propiedades públicas: ¿Cómo pueden los campos públicos "romper la carga perezosa" en Doctrine 2?
Tiene razón en que __get()
y __set()
pueden facilitar el acceso a los campos protected
/ private
.
Aquí hay un ejemplo simple:
public function __get($name)
{
if(property_exists($this, $name)){
return $this->$name;
}
}
Por supuesto que da acceso a todas las propiedades. Podría colocar eso en una clase que todas sus entidades extendieran, luego definir los campos no evaluables como private
. O puede usar una matriz para determinar qué propiedades deben ser accesibles: $this->accessable = array(''name'', ''age'')
Hay muchas formas de mantener todas las propiedades protegidas y aún así tener una forma razonablemente fácil de obtenerlas / configurarlas.
Personalmente, no me gusta el código repetitivo con un propósito trivial, hace que el código sea feo y aburrido de leer. Por lo tanto, prefiero fuertemente __get
/ __set
. Dicho esto, tienen algunos inconvenientes:
- son significativamente más lentas que las llamadas de función normales, aunque no tanto que debería hacer una diferencia en la práctica, ya que el acceso a la base de datos es varios órdenes de magnitud más lento
-
__get
/__set
solo se llama cuando el campo no está visible; Si accede a las propiedades en el código de la clase de entidad, no se invocan, y el proxy no tiene oportunidad de cargarse. (Doctrine intenta evitar esto cargando instantáneamente el proxy tan pronto como se llama a uno de sus métodos públicos, pero hay algunas excepciones como__construct
o__wake
donde eso no tendría sentido, por lo que puede meterse en problemas, por ejemplo, leyendo un campo en el constructor.) - PHP tiene algunos comportamientos confusos relacionados con los métodos mágicos, por ejemplo,
empty($entity->field)
no invocará__get
(y, por lo tanto, romperá el comportamiento del proxy si se usa)
Sí, los métodos de obtención y configuración son la forma de acceder a sus datos. Son un poco incómodos, por lo que a algunas personas no les gusta la doctrina2 o la hibernación. Pero solo necesita hacerlo una vez para cada entidad y entonces son muy flexibles para producir el formato de salida que espera. Puedes usar el cli para hacer algo de esto por ti. Pero cuando los haces rodar, no me parece un gran problema. Sobre todo porque solo haces esto a las propiedades que necesitas.
Aclamaciones
Si alguna información se debe hacer pública, defina un captador para ella. Si es modificable, agregue un setter (aún mejor, agregue un setter fluido).
Las API son más limpias de esta manera, sin la magia involucrada. No me gusta la magia en mi código.
Solo mis dos centavos :)
Por "establecedor fluido" me refiero a uno que implementa el patrón de interfaz fluida .