在我的应用程序中,只有管理员用户可以创建用户,并且理论上可以编辑用户。到目前为止,仅使用Symfony安全系统(无需FOSUserBundle管理-不需要其复杂性),创建具有不同角色的用户就可以了。让我完全逃避的挑战是如何在不知道用户密码的情况下编辑用户。我一直遇到预期的验证错误



。如何完成编辑?我肯定在这里错过了一些非常基本的东西。

编辑 Action :

    public function editAction($id) {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('ManaClientBundle:User')->find($id);
        $form = $this->createForm(new UserType(), $user);
        return array(
            'form' => $form->createView(),
            'user' => $user,
            'title' => 'Edit user',
            );
   }

更新 Action :
   public function updateAction(Request $request, $id) {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('ManaClientBundle:User')->find($id);
        $originalPassword = $user->getPassword();
        $form = $this->createForm(new UserType(), $user);
        $form->bind($request);
        if ($form->isValid()) {
            $plainPassword = $form->get('password')->getData();
            if (!empty($plainPassword))  {
                //encode the password
                $encoder = $this->container->get('security.encoder_factory')->getEncoder($entity); //get encoder for hashing pwd later
                $tempPassword = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
                $user->setPassword($tempPassword);
            }
            else {
                $user->setPassword($originalPassword);
            }
            $em->persist($user);
            $em->flush();
            return $this->redirect($this->generateUrl('user_main', array()));
        }

用户表格:
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('enabled', 'choice', array(
                'choices' => array('Yes' => 'Yes', 'No' => 'No'),
                'expanded' => true,
                'multiple' => false,
                'label' => 'Enabled: ',
            ))
            ->add('fname')
            ->add('sname')
            ->add('email')
            ->add('username')
            ->add('password', 'repeated', array(
                'type' => 'password',
                'invalid_message' => 'Password fields do not match',
                'first_options' => array('label' => 'Password'),
                'second_options' => array('label' => 'Repeat Password'),
            ))
            ->add('role', 'choice', array(
                'choices' => array('ROLE_USER' => 'User', 'ROLE_ADMIN' => 'Admin'),
                'expanded' => true,
                'multiple' => false,
                'label' => 'Group: ',
            ))
    ;
}

最佳答案

在我看到一个更优雅的解决方案之前,这是我想到的:

  • 创建一个UserEditType表单类,其中除密码字段外的所有字段
  • 将UserEditType分配给默认
  • 以外的验证组
  • 在2中为验证组配置密码长度约束。
  • 修改编辑和更新操作以使用UserEditType

  • 现在,无需密码即可编辑用户!

    UserEditType:
    class UserEditType extends AbstractType {
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder
                    ->add('enabled', 'choice', array(
                        'choices' => array('Yes' => 'Yes', 'No' => 'No'),
                        'expanded' => true,
                        'multiple' => false,
                        'label' => 'Enabled: ',
                    ))
                    ->add('fname')
                    ->add('sname')
                    ->add('email')
                    ->add('username')
                    ->add('role', 'choice', array(
                        'choices' => array('ROLE_USER' => 'User', 'ROLE_ADMIN' => 'Admin'),
                        'expanded' => true,
                        'multiple' => false,
                        'label' => 'Group: ',
                    ))
            ;
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array(
                'data_class' => 'Mana\ClientBundle\Entity\User',
                'validation_groups' => array('edit'),
            ));
        }
    

    用户实体中的密码:
     * @ORM\Column(name="userpass", type="string", length=100, nullable=false)
     * @Assert\NotBlank(message="Password may not be empty")
     * @Assert\Length(
     *      min = "5",
     *      max = "12",
     *      minMessage = "Password must be at least 5 characters long",
     *      maxMessage = "Password cannot be longer than than 12 characters",
     *      groups = {"Default"}
     * )
    

    更新 Action :
    public function updateAction(Request $request, $id) {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('ManaClientBundle:User')->find($id);
    
        $form = $this->createForm(new UserEditType(), $user);
        $form->bind($request);
        if ($form->isValid()) {
            $em->persist($user);
            $em->flush();
            return $this->redirect($this->generateUrl('user_main', array()));
        }
        return array(
            'form' => $form->createView(),
            'user' => $user,
            'title' => 'Edit user',
        );
    }
    

    关于php - Symfony2 : Edit user without having password,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15856396/

    10-10 09:01