Notre solution actuelle ORM utilise les données cartographes pour représenter les tables/vues dans la base de données qui renvoient alors un objet de collection qui peut être utilisé pour parcourir les enregistrements récupérés comme des objets du modèle. Entre les couches Mapper et modèle de données est une couche de référentiel qui gère les requêtes de domaine aux cartographes de données et renvoie les collections correspondantes ou objets de domaine. Nous envisageons actuellement de restructurer les responsabilités des couches Repository et Data Mapper afin que toutes les demandes d'application à la couche Data Mapper soient acheminées à travers le Repository et que le Data Mapper renvoie les lignes de données récupérées au Repository qui retourne ensuite le collecte nécessaire à l'objet demandeur. Ce que je me demande, c'est si c'est une bonne pratique de passer l'ensemble de l'objet Repository dans le Data Mapper correspondant afin de pouvoir appliquer l'accès aux Data Mappers uniquement à travers la couche Repository.Comment appliquer correctement l'utilisation correcte d'une méthode de classe?
À titre d'exemple, c'est fondamentalement la façon dont il fonctionne maintenant:
class DataMapper {
public function findAll(Criteria $criteria)
{
$select = $criteria->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return new Collection(array('data' => $rows, 'mapper' => get_class($this)));
}
}
Je pense à faire quelque chose comme ceci:
class Repository {
public function findAllByName(Model $model)
{
$this->_criteria->addCondition('name LIKE ?', $model->name);
$rows = $this->_mapper->findAll($this);
return new Collection(array('data' => $rows, 'repository' => get_class($this)));
}
}
class DataMapper {
public function findAll(Repository $repository)
{
$select = $repository->getCriteria()->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return $rows;
}
}
Et puis dans cette version, l'objet Collection lancerait un appel au dépôt qui pourrait d'abord chercher à travers ses objets mises en cache et seulement émettre un appel à la base de données pour charger le dossier si elle est nécessaire.