1

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

严重依赖MVC 中的模型应该如何构建?通过 tereško 和事实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)应该创建一堆它们,如何处理它们的创建!?

  • 我也应该有一个专门的收集工厂吗?
  • 我应该使用集合对象内的方法创建单个域对象吗?
  • 我应该使用集合映射器中的方法创建单个域对象吗?
  • 如果是这样,我应该将域对象工厂注入其中之一吗?(这可能需要一个 ServiceFactory 并注入更多的 Factory 依赖项,这很糟糕,对吧?)

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

4

0 回答 0