2013-08-23 42 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()'等) –

相關問題