Lasciatemi provare a chiarire cosa è possibile, non possibile e pianificato con esempi.
La citazione dal manuale significa sostanzialmente si potrebbe avere il seguente tipo di implementazione personalizzata:
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() { ... }
}
Ora si potrebbe usare come segue:
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
In altre parole, fino a quando un l'entità è NUOVA (non GESTITA, STACCATA o RIMOSSA) sei libero di utilizzare il tipo concreto di implementazione delle collezioni, anche se non è carina. Se non è NUOVO, è necessario accedere solo al tipo di interfaccia (e idealmente digitare suggerimenti su di esso). Ciò significa che il tipo di implementazione non ha molta importanza. Quando un'istanza MyEntity persistente viene recuperata dal database, non utilizzerà MyCollection (i costruttori non vengono invocati da Doctrine, sempre, dal momento che Doctrine ricostituisce solo oggetti esistenti/persistenti, non crea mai "nuovi"). E poiché tale entità è GESTITA, l'accesso deve comunque avvenire tramite il tipo di interfaccia.
Ora a quanto pianificato. Il modo più bello per avere collezioni personalizzate è anche avere un tipo di interfaccia personalizzata, ad esempio IMyCollection e MyCollection come tipo di implementazione.Poi, per farlo funzionare perfettamente con i servizi di persistenza Doctrine 2 si avrebbe bisogno di implementare un'implementazione PersistentCollection personalizzato, ad esempio, MyPersistentCollection che assomiglia a questo:
class MyPersistentCollection implements IMyCollection {
// ...
}
allora si sarebbe dire Dottrina nella mappatura di utilizzare il MyPersistentCollection wrapper per quella raccolta (ricorda, una PersistentCollection esegue il wrapping un tipo di implementazione di raccolta, implementando la stessa interfaccia, in modo che possa eseguire tutto il lavoro di persistenza prima/dopo la delega al tipo di implementazione della raccolta sottostante).
Quindi un'implementazione raccolta personalizzata sarebbe costituito da 3 parti:
- Tipo interfaccia
- tipo di implementazione (implementa tipo di interfaccia)
- tipo di involucro persistente (implementa tipo di interfaccia)
Ciò non solo consentirà di scrivere raccolte personalizzate che funzionano in modo incoerente con Doctrine 2 ORM ma anche di scrivere solo un tipo di wrapper persistente personalizzato, per e xample per ottimizzare il comportamento di caricamento lento/inizializzazione di una particolare raccolta in base alle esigenze specifiche dell'applicazione.
Non è ancora possibile farlo ma lo sarà. Questo è l'unico modo veramente elegante e completamente funzionale per scrivere e utilizzare le collezioni completamente personalizzate che si integrano perfettamente nello schema di persistenza trasparente fornita da Doctrine 2.
Per coloro che sono venuti qui cercando di trovare una risposta: Per ora, la [funzione] (https://github.com/doctrine/doctrine2/issues/5057) non è ancora implementata, si prega di contribuire in discussione discussione funzione (upvotes, use case, le tue soluzioni). – Arkemlar