提问人:Madara's Ghost 提问时间:1/20/2013 更新时间:1/20/2013 访问量:1242
如何在PHP中制作一个成功的领域对象工厂
How can I Make a Successful Domain Object Factory in PHP
问:
我正在摆弄一个 MVC 框架,我偶然发现了一个我不确定如何解决的问题。
我想为我的应用程序的模型层创建一个,但是,每个 Domain 对象都有一组不同的参数,例如:DomainObjectFactory
- 人 - $id、$name、$age。
- 发布 - $id、$author、$title、$content$comments
- 注释 - $id、$author$content
等等。我怎样才能轻松地告诉我的工厂我需要什么样的物体?
我想出了几个选择:
- 传递一个数组 - 我不喜欢这个数组,因为你不能依赖构造函数的合约来判断对象需要什么来工作。
- 制作一个接口,并制作具体的类 - 有问题,因为要制作的工厂太多了!
DomainObjectFactory
- 经常使用 Reflection - Service 定位器?我不知道,在我看来就是这样。
我可以在这里使用有用的设计模式吗?还是其他聪明的解决方案?
答:
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] 方法。这是故意的(服务“构建”做了不同的事情?)还是只是同一事物的不同名称?
上一个:图片库系统 - 哪种方法更好?
下一个:松散的搜索方法
评论