Gui*_*gis 3 php symfony doctrine-orm
我正在尝试添加一个简单的表单,以允许我的用户编辑他们的个人资料.我的问题是:
由于与表单"链接"的实体与当前用户对象相同($user === $entity见下文),如果表单验证失败,则使用修改后的用户对象呈现视图(即,使用无效表单的值) ).
在这里我的(经典)控制器:
public function profileAction()
{
$em = $this->getDoctrine()->getEntityManager();
$user = $this->get('security.context')->getToken()->getUser();
$entity = $em->getRepository('AcmeSecurityBundle:User')->find($user->id);
// $user === $entity => true
$form = $this->createForm(new ProfileType(), $entity);
$request = $this->getRequest();
if ($request->getMethod() === 'POST')
{
$form->bindRequest($request);
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('profile'));
}
}
return $this->render('AcmeSecurityBundle:User:profile.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何有两个区别对象$user和$entity.我使用过clone(),它适用于视图渲染部分($user对象未被修改),但它在数据库中创建了一条新记录,而不是更新旧记录.
PS:我知道我应该用FOSUserBundle.但我真的很想明白我的错误:)
我使用了与FOSUserBundle相同的解决方案,它$em->refresh()在表单验证失败时调用我的实体:
public function profileAction()
{
$em = $this->getDoctrine()->getEntityManager();
$user = $this->get('security.context')->getToken()->getUser();
$entity = $em->getRepository('AcmeSecurityBundle:User')->find($user->id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find User entity.');
}
$form = $this->createForm(new ProfileType(), $entity);
$request = $this->getRequest();
if ($request->getMethod() === 'POST')
{
$form->bindRequest($request);
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('profile'));
}
$em->refresh($user); // Add this line
}
return $this->render('AcmeSecurityBundle:User:profile.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您在" 如何使用Doctrine处理文件上载 " 中使用所谓的" 虚拟 "字段(在我的情况下为"picture_file",您需要手动清除它:
$em->refresh($user);
$user->picture_file = null; // here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7837 次 |
| 最近记录: |