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

Php 当管理员用户(从后端)使用FOSUserBundle更新任何用户配置文件时忽略密码,php,symfony,fosuserbundle,Php,Symfony,Fosuserbundle,我面临着一个类似于发布的问题,但由于我没有UserFormType,我不知道如何解决这个问题。这样做的目的不是每次我(以管理员身份登录并拥有正确权限)更改用户配置文件字段(例如电子邮件)时都要求输入密码。这是我的代码: public function editAction(Request $request, $id) { $em = $this->getDoctrine()->getManager(); $user = $em->getRepository('U

我面临着一个类似于发布的问题,但由于我没有
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()
    );
}

继续,我如何避免每次更新用户配置文件时询问密码,有什么帮助吗?

因此,问题似乎源于这样一个事实:您让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';
    }
}
然后,您的控制器将保持合理的相似性,除了不需要单独的表单工厂并使用您的用户类型:

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()
    );
}
不确定的细节,你的看法等,但你只需要渲染的形式和东西应该是黄金


希望我没有弄错方向。

它工作得很好,原则上我知道怎么做,我的意思是使用这种方法,但我想在遵循这一点之前打破我的头脑,看看第一种方法,即使用表单工厂的方法,是否起到了某种作用,并学到了一些新的东西。非常感谢