J'essaie de comprendre comment réutiliser des modèles de domaine dans différentes parties de l'application et j'ai l'impression que le modèle Data Mapper est la solution. L'exemple ci-dessous contient des méthodes qui accèdent directement aux méthodes du mappeur.Objet de domaine nécessitant plusieurs mappeurs de données
class Groups
{
protected $_groups = array();
public function addGroup($name)
{
$this->_groups[] = $name;
}
public function doSomethingGroupy($cakes)
{
// get all the groups that have cake
return $cakeyGroups;
}
}
... et un mappeur pour faire correspondre les méthodes de la classe Groups.
class GroupMapper
{
public function find($id, Groups $group)
{
// Mappy type things, maybe some sql
}
public function fetchByNeediness($cuddles, Groups $group)
{
// More mappy type things
}
public function save(Groups $groups)
{
// Saves
}
}
Cependant, si quelque temps que je voulais plus tard utiliser les mêmes modèles Groupes mais remplir les groupes en utilisant différentes requêtes que j'utiliseraient un autre cartographe.
class AngryGroupMapper
{
public function find($id, Groups $group)
{
// Something similar but with other tables and joins
}
public function fetchByRage($anger, Groups $group)
{
// Something new but only needed here
}
public function isEditable(Groups $groups)
{
// Do some querying
return $bool;
{
}
Maintenant, je sais que l'objectif est contrôleur Skinny - Modèle Fat, donc aurais-je un autre modèle à la carte du Mapper (pour ainsi dire) au modèle?
class FatModelRepository
{
public function getHappyGroups()
{
$mapper = new GroupMapper();
return $mapper->fetchByNeediness('Puffy Shoes', new Groups());
}
public function getSadGroups()
{
$mapper = new AngryGroupMapper();
return $mapper->fetchByRage('Aghh!', new Groups());
{
public function save(Groups $groups)
{
$mapper = new GroupMapper();
return $mapper->save($groups);
{
}
Que faire si "Groups" est une collection contenant des objets "Group" et que ce sont des modèles eux-mêmes qui nécessitent un mappage dépendant. Devriez-vous les détacher des groupes, les passer à travers un mappeur, puis les rattacher à la collection? Cela signifie-t-il que le client/contrôleur a besoin des connaissances des mappeurs? – gawpertron
Votre 'FatModel' s'appelle un référentiel. Il y a une bonne explication de ceci ici: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca
Pourquoi voudriez-vous? Concevez-le en fonction de vos besoins. Je n'utiliserais pas de repo comme cache. Mettez le cache sur le mappeur de données. – rojoca