Potresti trarre beneficio dallo studio di Doctrine2. Anche se utilizza il "Pattern di repository", utilizza anche il "Pattern Mapper dei dati".
Il seguente è un esempio di utilizzo del gestore di entità:
/* $movieRepository = MovieRepository -> extends EntityRepository -> implements ObjectRepository */
if (null !== $movie = $movieRepository->findOneBy(array('name' => 'Mad Max'))) {
$movie = new Movie();
$movie->setName('Mad Max');
/* $entityManager = EntityManager -> implements ObjectManager */
$entityManager->persist($movie);
}
$movie->setViews($movie->getViews() + 1);
$entityManager->flush();
Si noti qui che Doctrine2 definisce due classi principali (una astratta).
abstract class EntityRepository implements ObjectRepository
{
...
}
class EntityManager implements ObjectManager
{
...
}
Tradizionalmente il repository viene utilizzato solo per effettuare query, ad esempio per le selezioni, raramente per gli aggiornamenti o gli inserimenti. L'interfaccia ObjectRepository
definisce i metodi di selezione comuni:
-
find($id)
-
findBy(array $criteria)
-
findOneBy(array $criteria)
Tuttavia, il gestore di entità ha i metodi relativi alla persistenza:
-
persist($entity)
-
flush($entity = null)
Il gestore di entità non richiede mai un tipo specifico di entità oltre al "range" di classi registrate come mappate al suo database.
Se vuoi creare la tua libreria di persistenza, puoi utilizzare le interfacce Doctrine\Common\Persistance
per aiutarti a progettarla.
-
ObjectRepository
-
ObjectManager
Un motivo per cui potresti scegliere di persist
entità e flush
tutto in una volta, è creare una transazione coerente che "finalizza" il processo. Contro "salvare" ciascuna entità individualmente durante il processo, che aumenterebbe gradualmente la quantità di IO nell'applicazione, influendo sulle prestazioni.
TL; DR
Incorporare il pattern Data Mapper nella progettazione e migrare la persistenza lontano dai repository e invece incapsularla in un singolo gestore per il database. Quindi limita il repository alle query di selezione.