我正在摆弄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'));
}