Symfony2:如何使用表单修改当前用户的实体?

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.但我真的很想明白我的错误:)

Gui*_*gis 9

我使用了与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)