Я пытаюсь выяснить, как повторно использовать модели домена в разных частях приложения, и у меня возникает ощущение, что шаблон Data Mapper - это путь вперед. В приведенном ниже примере приведены методы, которые непосредственно получают доступ к методам Mapper.Объект домена, которому требуется больше одного Data Mapper
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;
}
}
... И сопоставление методов в классе групп.
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
}
}
Однако, если через некоторое время я хотел бы использовать одни и те же группы модели, но заселить группы с использованием различных запросов я бы использовать другой картограф.
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;
{
}
Теперь я знаю цель тощий Controller - Fat модели, так что у меня есть еще одна модель, чтобы отобразить Mapper (так сказать) к модели?
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);
{
}
Что делать, если «Группы» представляют собой коллекцию, содержащую объекты «Группа», и это сами модели, которые требуют зависимого сопоставления. Вам придется отделить их от групп, передать их через Mapper, а затем снова привязать их к коллекции? Значит ли это, что клиенту/Контролеру нужны знания о Mappers? – gawpertron
Ваш 'FatModel' называется репозиторием. Здесь есть хорошее объяснение: http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca
Зачем вам это нужно? Создайте его в соответствии с вашими потребностями. Я бы не использовал репо в качестве кеша. Поместите кеш на карту данных. – rojoca