Ho letto il pattern del repository, con l'intenzione di implementarlo nella mia applicazione. Quasi tutti gli esempi che ho trovato su Internet utilizzano una sorta di framework esistente piuttosto che mostrare come implementarlo "da zero". Ecco i miei primi pensieri su come potrei implementarlo - mi stavo chiedendo se qualcuno potrebbe darmi dei consigli se è corretto?
Ho due tabelle, denominate CONTAINERS e BITS. Ogni CONTENITORE può contenere un numero qualsiasi di BIT. Li rappresento come due classi:
class Container{
private $bits;
private $id;
//...and a property for each column in the table...
public function __construct(){
$this->bits = array();
}
public function addBit($bit){
$this->bits[] = $bit;
}
//...getters and setters...
}
class Bit{
//some properties, methods etc...
}
Ogni classe avrà una proprietà per ogni colonna nella rispettiva tabella. Poi ho un paio di 'repository' che gestiscono cose da fare con il salvataggio / recupero di questi oggetti dal database:
//repository to control saving/retrieving Containers from the database
class ContainerRepository{
//inject the bit repository for use later
public function __construct($bitRepo){
$this->bitRepo = $bitRepo;
}
public function getById($id){
//talk directly to Oracle here to all column data into the object
//get all the bits in the container
$bits = $this->bitRepo->getByContainerId($id);
foreach($bits as $bit){
$container->addBit($bit);
}
//return an instance of Container
}
public function persist($container){
//talk directly to Oracle here to save it to the database
//if its ID is NULL, create a new container in database, otherwise update the existing one
//use BitRepository to save each of the Bits inside the Container
$bitRepo = $this->bitRepo;
foreach($container->bits as $bit){
$bitRepo->persist($bit);
}
}
}
//repository to control saving/retrieving Bits from the database
class BitRepository{
public function getById($id){}
public function getByContainerId($containerId){}
public function persist($bit){}
}
Pertanto, il codice che utilizzerei per ottenere un'istanza di Container dal database sarebbe:
$bitRepo = new BitRepository();
$containerRepo = new ContainerRepository($bitRepo);
$container = $containerRepo->getById($id);
O per crearne uno nuovo e salvarlo nel database:
$bitRepo = new BitRepository();
$containerRepo = new ContainerRepository($bitRepo);
$container = new Container();
$container->setSomeProperty(1);
$bit = new Bit();
$container->addBit($bit);
$containerRepo->persist($container);
Qualcuno può consigliarmi se ho implementato correttamente questo modello? Grazie!