管理员用户(来自后端)使用FOSUserBundle更新任何用户配置文件时忽略密码

时间:2014-09-15 03:29:01

标签: php symfony fosuserbundle

我遇到的问题就像发布here的那个问题,但由于我没有UserFormType,我不知道如何解决这个问题。每次我(以管理员身份登录并具有正确的权限)将更改用户个人资料字段(例如电子邮件)时,我们的想法是不要求密码。这是我的代码:

public function editAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();
    $user = $em->getRepository('UserBundle:User')->find($id);

    /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
    $formFactory = $this->container->get('fos_user.profile.form.factory');

    $form = $formFactory->createForm();
    $form->setData($user);

    if ('POST' === $request->getMethod())
    {
        $form->handleRequest($request);
        if ($form->isValid())
        {
            /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
            $userManager = $this->container->get('fos_user.user_manager');
            $userManager->updateUser($user);
        }
    }

    return array(
        'form' => $form->createView(),
        'id' => $user->getId()
    );
}

恢复,每次我想更新用户个人资料时,如何避免要求输入密码?有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

所以看起来这个问题源于你让FOSUserBundle为你做所有事情的事实,这是公平的,但却更难调整行为。你可以覆盖各种各样的东西来改变它的工作方式,但我自己的应用程序根本没有使用FOSUserBundle来管理用户注册后,你可以简单地创建你自己的简单表单来做到这一点,例如:

class UserType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', 'text')
            ->add('email', 'email')
            ->add('save', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Your\Bundle\Entity\User',
        ));
    }

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'user';
    }
}

然后您的控制器将保持相当类似,除非不需要单独的Form Factory并使用您的UserType:

public function editAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();
    $user = $em->getRepository('UserBundle:User')->find($id);

    /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
    //Don't need this!
    //$formFactory = $this->container->get('fos_user.profile.form.factory');

    //$form = $formFactory->createForm();
    //$form->setData($user);
    $form = $this->createForm(new UserType(), $user);

    if ('POST' === $request->getMethod())
    {
        $form->handleRequest($request);
        if ($form->isValid())
        {
            /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
            $userManager = $this->container->get('fos_user.user_manager');
            $userManager->updateUser($user);
        }
    }

    return array(
        'form' => $form->createView(),
        'id' => $user->getId()
    );
}

不确定您的View等细节,但您只需要渲染表单,事情应该是金色的!

希望我没有错误的结局。