Déjame intentar aclarar lo que es posible, no es posible y lo planeado con ejemplos.
La cita del Manual básicamente significa que podría tener el siguiente tipo de implementación personalizada:
use Doctrine\Common\Collections\Collection;
// MyCollection is the "implementation type"
class MyCollection implements Collection {
// ... interface implementation
// This is not on the Collection interface
public function myCustomMethod() { ... }
}
Ahora se podría utilizar de la siguiente manera:
class MyEntity {
private $items;
public function __construct() {
$this->items = new MyCollection;
}
// ... accessors/mutators ...
}
$e = new MyEntity;
$e->getItems()->add(new Item);
$e->getItems()->add(new Item);
$e->getItems()->myCustomMethod(); // calling method on implementation type
// $em instanceof EntityManager
$em->persist($e);
// from now on $e->getItems() may only be used through the interface type
En otras palabras, siempre y cuando una La entidad es NUEVA (no administrada, separada o eliminada). Usted es libre de utilizar el tipo concreto de implementación de colecciones, incluso si no es bonita. Si no es NUEVO, debe acceder solo al tipo de interfaz (e idealmente escriba-sugerencia sobre él). Eso significa que el tipo de implementación realmente no importa. Cuando una instancia persistente de MyEntity se recupera de la base de datos, no usará una MyCollection (los constructores no son invocados por Doctrine, nunca, ya que Doctrine solo reconstituye objetos ya existentes/persistentes, nunca crea "nuevos"). Y dado que dicha entidad está ADMINISTRADA, el acceso debe realizarse de todos modos a través del tipo de interfaz.
Ahora a lo que está previsto. La forma más hermosa de tener colecciones personalizadas es tener también un tipo de interfaz personalizada, digamos IMyCollection y MyCollection como el tipo de implementación.Entonces, para que funcione a la perfección con los servicios de persistencia Doctrina 2 que se necesita para implementar una aplicación PersistentCollection personalizada, por ejemplo, MyPersistentCollection que se parece a esto:
class MyPersistentCollection implements IMyCollection {
// ...
}
continuación te contarían Doctrina en el mapeo a utilizar el MyPersistentCollection contenedor para esa colección (recuerde, una PersistentCollection envuelve un tipo de implementación de colección, implementando la misma interfaz, para que pueda hacer todo el trabajo de persistencia antes/después de delegar en el tipo de implementación de la colección subyacente).
Así que una aplicación de colección personalizada consistiría en 3 partes:
- Tipo de interfaz
- tipo de implementación (implementa tipo de interfaz)
- persistente tipo de envoltorio (implementa tipo de interfaz)
Esto no solo hará posible la escritura de colecciones personalizadas que funcionen sin problemas con Doctrine 2 ORM, sino también para escribir solo un tipo de contenedor persistente personalizado, para e ejemplo para optimizar el comportamiento de carga lenta/inicialización de una colección particular a las necesidades específicas de la aplicación.
Todavía no es posible hacer esto, pero lo será. Esta es la única manera realmente elegante y totalmente funcional para escribir y utilizar colecciones completamente personalizadas que se integran perfectamente en el esquema de persistencia transparente proporcionada por Doctrina 2.
Para aquellos que vinieron aquí tratando de encontrar una respuesta: Hasta el momento, la [función] (https://github.com/doctrine/doctrine2/issues/5057) aún no está implementada, por favor contribuya en el hilo de discusión de la función (votaciones ascendentes, casos de uso, sus soluciones). – Arkemlar