Ich versuche herauszufinden, wie Domain-Modelle in verschiedenen Teilen der Anwendung wiederverwenden und ich habe das Gefühl, dass das Data Mapper-Muster der Weg ist. Das folgende Beispiel enthält Methoden, die direkt auf die Methoden des Mappers zugreifen.Domain-Objekt, das mehr als einen Data Mapper benötigt
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;
}
}
... Und ein Mapper die Methoden der Groups-Klasse zu entsprechen.
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
}
}
Allerdings, wenn irgendwann später habe ich die gleichen Gruppen Modelle verwenden wollten, aber die Gruppen mit verschiedenen Abfragen füllen würde ich einen anderen Mapper verwenden.
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;
{
}
Jetzt kenne ich das Ziel dünnen Controller ist - Fat Model, so hätte ich ein anderes Modell die Mapper Karte (sozusagen) an das Modell?
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);
{
}
Was ist, wenn "Gruppen" eine Sammlung ist, die "Gruppen" -Objekte enthält und diese selbst Modelle sind, die eine abhängige Zuordnung erfordern. Müsstest du sie von Gruppen lösen, sie durch einen Mapper leiten und sie dann wieder an die Sammlung anhängen? Bedeutet das, dass der Kunde/Controller Kenntnisse der Mapper benötigt? – gawpertron
Ihr 'FatModel' wird als Repository bezeichnet. Es gibt eine gute Erklärung dafür hier: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca
Warum würden Sie? Entwerfen Sie es nach Ihren Bedürfnissen. Ich würde kein Repo als Cache verwenden. Setzen Sie den Cache auf den Data Mapper. – rojoca