我正在运行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
为避免此错误,正如您在上面的控制器中所看到的,我尝试保留旧的(我知道这可能不是最佳做法)。
答案 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');
}