如何在PHP中制作一个成功的领域对象工厂

How can I Make a Successful Domain Object Factory in PHP

提问人:Madara's Ghost 提问时间:1/20/2013 更新时间:1/20/2013 访问量:1242

问:

我正在摆弄一个 MVC 框架,我偶然发现了一个我不确定如何解决的问题。

我想为我的应用程序的模型层创建一个,但是,每个 Domain 对象都有一组不同的参数,例如:DomainObjectFactory

  • 人 - $id、$name、$age。
  • 发布 - $id、$author、$title、$content$comments
  • 注释 - $id、$author$content

等等。我怎样才能轻松地告诉我的工厂我需要什么样的物体?

我想出了几个选择:

  • 传递一个数组 - 我不喜欢这个数组,因为你不能依赖构造函数的合约来判断对象需要什么来工作。
  • 制作一个接口,并制作具体的类 - 有问题,因为要制作的工厂太多了!DomainObjectFactory
  • 经常使用 Reflection - Service 定位器?我不知道,在我看来就是这样。

我可以在这里使用有用的设计模式吗?还是其他聪明的解决方案?

php oop 模型-视图-控制器 设计-模式 域对象

评论


答:

3赞 tereško 1/20/2013 #1

为什么要初始化分配了所有属性的域对象

相反,只需创建一个空的 Domain 对象。如果工厂检查有要执行的方法,则可以进行检查。哦。。如果您使用的是 DAO,您可能希望在域对象中构建并注入适当的 DAO,而不是直接与 Mapper 交互。prepare()

值的赋值应该只在服务中进行。通过使用普通的二传手。

一些例子:

检索现有项目

public function retrieveArticle( $id )
{
    $mapper = $this->mapperFactory->create('Article');
    $article = $this->domainFactory->create('Article');
    
    $article->setId( $id );
    $mapper->fetch( $article );
    $this->currentArticle = $article;
}

发表新评论

public function addComment( $id, $content )
{

    $mapper = $this->mapperFactory->create('article');
    $article = $this->domainFactory->create('Article');
    $comment = $this->domainFactory->create('Comment');

    $comment->setContent( $content );
    $comment->setAuthor( /* user object that you retrieved from Recognition service */ );

    $article->setId( $id );
    $article->addComment( $comment );
    // or you might retrieve the ID of currently view article
    // and assign it .. depends how you build it all
    
    $mapper->store( $article ); // or 
}

传递用户输入

public function getArticle( $request )
{
    $library = $this->serviceFactory->build('Library');
    $library->retrieveArticle( $request->getParameter('articleId'));
}

评论

0赞 Madara's Ghost 1/20/2013
所以你是说我应该生成空的域对象,然后让我的数据映射器单独填充它们?如何处理用户输入?
0赞 tereško 1/20/2013
当工厂发布 DO 时,它是空的。你给它分配一些条件,然后获取值..或存储它们。
0赞 Madara's Ghost 1/20/2013
但是,您将如何处理用户输入?制作自己的 DM 听起来不对
0赞 Steve Cooke 2/10/2014
我不确定这是否正确,但我的前端控制器捕获用户输入(通常来自 POST 数组,但也可能来自其他输入),并创建一个包含用户输入的数据的 Request 对象,然后将其传递到相应的控制器(基于请求的操作)。
0赞 Andrew 7/27/2014
@tereško在代码示例中,你对映射器/域工厂使用了 [create] 方法,对服务工厂使用了 [build] 方法。这是故意的(服务“构建”做了不同的事情?)还是只是同一事物的不同名称?