php – Symfony2:无需密码即可编辑用户

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

Password cannot be empty

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

编辑动作:

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',);
   }

更新动作:

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',array(
                'choices' => array('ROLE_USER' => 'User','ROLE_ADMIN' => 'Admin'),'label' => 'Group: ',))
    ;
}
直到我看到更优雅的解决方案,这就是我想出的:

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

现在用户可以在没有密码的情况下进行编辑!

UserEditType:

class UserEditType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder,array $options) {
        $builder
                ->add('enabled',array(
                    'choices' => array('Yes' => 'Yes',))
                ->add('fname')
                ->add('sname')
                ->add('email')
                ->add('username')
                ->add('role',array(
                    'choices' => array('ROLE_USER' => 'User',))
        ;
    }

    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"}
 * )

更新动作:

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(),);
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...