如何在PHP中创建一个成功的域对象工厂?



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

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

  • 人物- $id, $name, $age.
  • Post - $id, $author, $title, $content, $comments
  • 注释- $id, $author, $content

以此类推。我如何方便地告诉我的工厂我需要什么样的物品?

我想到了几个选项:

  • 传递一个数组——我不喜欢这种方式,因为你不能依靠构造函数的契约来告诉对象需要什么来工作。
  • DomainObjectFactory成为一个接口,并创建具体的类——这是有问题的,因为要创建的工厂太多了!
  • 使用反射-服务定位器多少?我不知道,我只是觉得是这样。

这里有什么有用的设计模式可以使用吗?或者其他聪明的解决方案?

为什么要初始化一个具有所有属性的域对象 ?

只需创建一个空的Domain Object。你可以在工厂检查,如果它有prepare()方法执行。哦. .如果您正在使用DAO,而不是直接与映射器交互,您可能希望在域对象中构造并注入适当的DAO

值的赋值应该只发生在Service中。

一些例子:

检索现有文章

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'));
}

相关内容

  • 没有找到相关文章

最新更新