如何处理域对象创建“内部”集合

时间:2016-07-22 16:27:28

标签: php model-view-controller collections factory domain-object

我是MVCish结构的新手,所以请放轻松。为了理解目的,我正在编写自己的小MVCish“框架”。我一点一点地想要理解所有人是如何以正确的方式融合在一起的。

tereško严重依赖How should a model be structured in 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)这样的方法应该创建一堆,如何处理它们的创建!?

  • 我是否还应该有专门的收藏工厂?
  • 我应该使用Collection Object中的方法创建单个域对象吗?
  • 我应该使用Collection Mapper中的方法创建单个域对象吗?
  • 如果是这样,我应该将Domain Object Factory注入其中一个吗? (这很可能需要一个ServiceFactory注入更多的工厂依赖项,这很糟糕,对吗?)

我相信这可以通过编码不良的方式轻松实现,但我正在努力寻找最优雅,最干净的解决方案。

0 个答案:

没有答案