Pautas sobre el uso de Doctrine

LIBP-0105 (Libro de pautas)

A continuación se van a resumir un conjunto de buenas practicas para el uso de Doctrine como motor de mapeo ORM . Las mejores prácticas mencionadas aquí que afectan al diseño de bases de datos se refieren en general a las mejores prácticas cuando se trabaja con la librería y están destinadas a mejorar su rendimiento y eficiencia

Pautas

TítuloCarácter
No se deben usar propiedades publicas en entidadesObligatoria
Restringir las relaciones en la medida de lo posibleObligatoria
Evitar el uso de claves compuestasObligatoria
Utilice prudentemente los eventosObligatoria
Use las actualizaciones en cascadas con cuidadoRecomendada
No permita el uso de caracteres especialesObligatoria
Inicializar las colecciones de negocioObligatoria
Evite mapear las claves externas a atributos en una entidadObligatoria
Establecer los límites de las transacciones de forma explícitaRecomendada

No se deben usar propiedades publicas en entidades

Es muy importante no asignar propiedades públicas a las entidades, sólo protegidas o las privadas. La razón de esto es simple, cada vez que accede a una propiedad pública de un objeto proxy que no se ha inicializado todavía, el valor de retorno será nulo. Doctrine no puede conectar con este proceso y la entidad realiza una carga perezosa.

Esto puede crear situaciones en las que se dificulta la depuración del error. Por lo tanto, es recomendable que solo existan propiedades privadas y protegidas en las entidades y el uso de métodos getter o __get mágica () para acceder a ellos.

Restringir las relaciones en la medida de lo posible

Es recomendable restringir las relaciones tanto como sea posible. Esto significa:

  • Eliminar las asociaciones no esenciales
  • Imponer un sentido de recorrido (evitar las asociaciones bidireccionales si es posible)

y produce los siguientes beneficios

  • Simplifica el código del modelo de dominio
  • Reduce el trabajo para Doctrine
  • Se reduce el acoplamiento en el modelo de dominio

Evitar el uso de claves compuestas

A pesar de que Doctrine apoya plenamente claves compuestas, es mejor no usarlas si es posible.Se requiere un trabajo adicional en Doctrine para el manejo de claves compuestas y por lo tanto tienen una mayor probabilidad de errores y un consumo mayor de recursos.

Utilice prudentemente los eventos

El sistema de eventos de Doctrine es grande y rápido. A pesar de esto, hacer un uso intensivo de los eventos, sobre todo ciclo de vida de los eventos, puede tener un impacto negativo en el rendimiento de su aplicación. Es recomendable realizar un manejo de eventos de manera cautelosa.

Use las actualizaciones en cascadas con cuidado

Las operaciones automáticas en cascada de persistir / eliminar / fusionar son muy útiles pero deben usarse con cuidado. No sólo tiene que añadir todas las cascadas a todas las asociaciones. Piense en lo que realmente hacen las cascadas y si tiene sentido para una asociación particular. Habida cuenta del contexto lo más probable es utilizarla

No permita el uso de caracteres especiales

Evite el uso de caracteres que no sean ASCII en clases , atributos, tablas o nombres de columna. Doctrina por sí mismo no es seguro con respecto a la codificación unicode y no será hasta el que el propio PHP sea completamente Unicode (php6).

Inicializar las colecciones de negocio

Se recomienda inicializar todas las colecciones de negocio en el constructor en las entidades

<?php

namespace MyProject\Model;
use Doctrine\Common\Collections\ArrayCollection;

class User {
    private $addresses;
    private $articles;

    public function __construct() {
        $this->addresses = new ArrayCollection;
        $this->articles = new ArrayCollection;
    }
}

Evite mapear las claves externas a atributos en una entidad

Las claves externas no tienen sentido alguno en un modelo de objetos. Las claves externas son cómo establece relaciones una base de datos relacional . Su modelo de objetos establece relaciones a través de referencias a objetos. Así, el mapeo de claves externas a los atributos de un objeto son culpables en gran medida de las fugas de datos del modelo relacional en el modelo de objetos, algo que realmente no debe hacer.

Establecer los límites de las transacciones de forma explícita

Mientras Doctrine pasará automáticamente todas las operaciones, a una transacción en flush (), se considera mas recomendable establecer explícitamente los límites de transacciones usted mismo. De lo contrario todas las consultas individuales se envuelven en una operación pequeña (Sí, las consultas SELECT, también) ya que no puede comunicarse con su base de datos fuera de una transacción. Si bien tales operaciones de sólo lectura (SELECT), consultas en general no tiene ningún impacto notable en el rendimiento, sigue siendo preferible utilizar un número menor de operaciones bien definidas que se establecen a través de límites de transacción explícitos.