Я новичок в структуре MVCish, так что будьте осторожны со мной, пожалуйста. Я пишу свою собственную маленькую MVCish-структуру для понимания целей. Постепенно я намереваюсь понять, как все сходится правильно.
Сильно полагаясь на Как модель должна быть структурирована в MVC? Терешко и тот факт, что Domain Object != Domain Object Collection
Я пытаюсь найти способ обрабатывать создание доменных объектов в пакетном режиме и их соответствующей вставки в коллекцию.
О своем примере, он передает один экземпляр ServiceFactory как контроллеру, так и представлению. В этом экземпляре MapperFactory и DomainObjectFactory вставлены в его конструктор. Там нет Коллекционная фабрика.
$serviceFactory = new ServiceFactory(
new DataMapperFactory($dbhProvider),
new DomainObjectFactory
);
/*
* Initialization of View
*/
$class = '\\Application\\View\\' . $request->getResourceName();
$view = new $class($serviceFactory);
$view->setDefaultTemplateLocation(__DIR__ . '/templates');
/*
* Initialization of Controller
*/
$class = '\\Application\\Controller\\' . $request->getResourceName();
$controller = new $class($serviceFactory, $view);
ServiceFactory.php будет что-то вроде
class ServiceFactory
{
private $domObjFactory;
private $mapperFactory;
private $services = array();
public function __construct(MapperFactory $mapperFactory, DomObjFactory $domObjFactory)
{
$this->mapperFactory = $mapperFactory;
$this->domObjFactory = $domObjFactory;
}
public function create($name)
{
if ( array_key_exists($name, $this->services) === false )
{
$serviceName = '\Vendor\\'.$name.'Service';
$this->services[$name] = new $serviceName($this->mapperFactory, $this->domObjFactory);
}
return $this->services[$name];
}
}
В качестве примера, скажем, у меня есть доменный объект с именем Contract
и я хочу, чтобы мое мнение показало их всех в списке. Вероятно, следует сказать «модель» что-то вроде $ContractService->fetchAll()
Это создаст экземпляр коллекции и скажет мапперу заполнить ее всеми контрактами. Правильно?
Учитывая, что коллекция должна содержать доменные объекты и такой метод, как $ContractMapper->fetchAll($collection)
наверное стоит создать кучу из них, как справиться с их созданием !?
Я считаю, что это может быть легко достигнуто плохо закодированным способом, но я пытаюсь найти самое элегантное и чистое решение.
Задача ещё не решена.
Других решений пока нет …