在我的应用程序中,只有管理员用户可以创建并理论上编辑用户.到目前为止,仅使用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(),); }