【发布时间】:2015-09-02 09:35:47
【问题描述】:
Symfony2中有很多管理实体的方法,但我不知道哪个更好
解决方案 1:在控制器中
public function myAction()
{
$myEntity = new MyEntity();
$form = $this->createForm($myEntityType, $myEntity);
...
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager()
$em->persist($myEntity);
$em->flush()
}
...
}
解决方案 2:使用自定义 entityManager
public function myAction()
{
$myEntityManager = $this->get('manager.my_entity');
$myEntity = $myEntityManager->create();
$form = $this->createForm($myEntityType, $myEntity);
...
if ($form->isValid()) {
$myEntityManager->update($myEntity);
}
...
}
解决方案 3:使用工厂
public function myAction()
{
$myEntityFactory = $this->get('factory.my_entity');
$myEntity = $myEntityFactory->create();
$form = $this->createForm($myEntityType, $myEntity);
...
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager()
$em->persist($myEntity);
$em->flush()
}
...
}
我更喜欢解决方案 2,但人们告诉我这不是单一责任模式,因为你有一个工厂和一个更新它的方法。解决方案可能是在管理器中使用工厂,但这会带来一些复杂性。
【问题讨论】:
-
第一种方式肯定不好。那是因为在控制器中创建对象(
new运算符硬编码)会降低可测试性。 -
恐怕这将主要基于意见。 IMO 以上解决方案均不正确。控制器应该只将数据传递给域模型并根据结果返回响应。没有实体管理器、表单处理、对象实例化之类的东西。第三种解决方案可能更可取,但前提是它被移动到正确的域模型对象并且没有留在控制器中。
标签: symfony