Symfony-编辑用户实体而不更改密码

时间:2018-08-17 08:15:53

标签: symfony symfony-forms symfony-3.4 symfony3.x

我正在运行Symfony 3.4.14,并且我开发了自己的User Bundle,我对FOS的体验很差,所以我不想再使用了。我的目标是让管理员用户创建/编辑/删除用户,我的意思是其他用户帐户。

我做了:

  • 用户实体
  • 登录表单
  • 注册表格

..而我受困于“更新”表单。我想让管理员在不编辑密码的情况下编辑用户,但是给他们机会,如果需要的话。下面是我在控制器中的EditUserAction:

<?php

    /**
    * @Route("/admin/users/edit/{id}", requirements={"id" = "\d+"}, name="admin_users_edit")
    * @Template("@Core/admin/users_edit.html.twig")
    * @Security("has_role('ROLE_ADMIN')")
    */
    public function EditUserAction($id, Request $request, UserPasswordEncoderInterface $passwordEncoder)
    {
        $user = $this->getDoctrine()->getRepository('CoreBundle:User')->findOneBy([ 'id'=>$id, 'deleted' => 0 ]);
        if ( $user )
        {
            $old_password = $user->getPassword();
            $form = $this->createForm(UserType::class, $user);
            $form->handleRequest($request);
            if ($form->isSubmitted() && $form->isValid())
            {
                // If admin changed the user password
                if ( $user->getPlainPassword() )
                {
                    $password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
                    $user->setPassword($password);
                }
                // If admin didn't change the user password, we persist the old one
                else
                {
                    $user->setPassword($old_password);
                }
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($user);
                $entityManager->flush();
            }
            return array('form' => $form->createView());
        }
        return $this->redirectToRoute('admin_users');
    }

情况1(当管理员选择更改用户密码时)工作良好,但另一种情况(当管理员不想更改密码时)失败。它们无法让2个密码输入为空。我无法摆脱调试工具栏中的验证错误:

Path: data.plainPassword
Message: This value should not be blank

为避免此错误,正如您在上面的控制器中所看到的,我尝试保留旧的(我知道这可能不是最佳做法)。

2 个答案:

答案 0 :(得分:0)

在表单/实体(定义验证的位置)中,您应该编写自己的约束(documentation)或验证回调(documentation)。您可以在其中进行检查-如果value为null,则不进行验证;如果不为null,则运行验证。

答案 1 :(得分:0)

您需要同时使用两种单独的方法。

public function changePasswordAction(Request $request)
 {
  // your code for changing password. 
 }

 /**
 * @Route("/admin/users/edit/{id}", requirements={"id" = "\d+"},     name="admin_users_edit")
 * @Template("@Core/admin/users_edit.html.twig")
 * @Security("has_role('ROLE_ADMIN')")
 */
public function editUserAction(User $user = null, Request $request, UserPasswordEncoderInterface $passwordEncoder)
{
    //you can directly give your User Entity reference in parameters and you dont need to write an extra query to find user. 

    if ( $user === null){
        //return user not found
    }
    else if($user->isDeleted() === false)
    {
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid())
        {
            //your code
        }
        // your code
    }
    return $this->redirectToRoute('admin_users');
}