2013-08-23 22 views
0

我的博客包中有一个Post实体。帖子可以有很多评论。当我创建一个新的注释实体附加到一个职位,我必须设置了一堆诸如性能,使用默认属性创建实体对象的最佳方法

$comment->setTimestamp(new \DateTime()); 
$comment->setUserId($this->getUser()->getId()); 
$comment->setHost($this->getClientIP()); 

默认时区是很容易在实体的构造函数。构建实体时如何自动设置用户标识和密码? getClientIP目前是控制器中的一个功能。这应该是服务。我可以有一家工厂为我创建评论吗?

+0

顺便说一句,对于时间戳..看看Gedmo包(https://github.com/l3pp4rd/DoctrineExtensions)。它具有以下内容:Timestampable - 更新创建,更新甚至属性更改的日期字段。 – NoScope

+0

我认为你没有使用Doctrine 2? – Cerad

回答

0

您可以从实体构造中调用任何实体方法,并且可以将任何内容从控制器传递到评论的新实例。 例如,获取控制器操作中的时间戳,用户标识和主机,并将这些参数作为参数传递给Comment实体的构造。 调用构造函数中的setter方法。

+0

感谢您的回复。评论可能不是一个很好的例子,因为这将由一个控制器处理。如果我想为来自许多控制器的帖子添加评论,我需要一个工厂来创建带有默认值的评论,例如user和ip。 – shapeshifter

0

可以在控制器创建辅助功能为

protected function getNewComment() { 
    $comment = new Comment(); 
    $comment->setTimestamp(new \DateTime()); 
    $comment->setUserId($this->getUser()->getId()); 
    $comment->setHost($this->getClientIP()); 

    return $comment; 
} 

然后

$comment = $this->getNewComment(); 
+0

确实,我可以将其移动到服务中吗?说评论实际上是一个笔记对象,可以附加到其他实体?所以我会有一个笔记服务或工厂,我可以打电话,将设置defaultS? – shapeshifter

+0

当然,如果你可以得到所有的依赖。你可以传递'security'来服务并获得当前用户,但是我不知道'$ this-> getClientIP()'。如果你可以从'request'中提取IP,那么充当工厂的服务是个好主意。 –

+0

我打算把getIP()也放到客户端服务中。 – shapeshifter

2

在我看来,你最好的选择将是一个class CommentFactory extends EntityFactory

工厂将负责创建实体适合你,你传递所需的实体(如用户实体),它会为您返回新的对象:

$commentFactory = new CommentFactory($user, $client, $whatever); 
$comment = $commentFactory->getNewComment(); 
+0

这也是我的想法。 EntityFactory类在哪里?我无法在API中找到它。 – shapeshifter

+0

它不存在,你需要做到:)。它应该是一个抽象类,在工厂环境中有未定义的方法('create()'等) –

相关问题