使用 FOS 用户包编辑用户配置文件

Posted

技术标签:

【中文标题】使用 FOS 用户包编辑用户配置文件【英文标题】:Edit user profile using FOS User Bundle 【发布时间】:2016-05-19 02:45:10 【问题描述】:

我正在使用带有 FOSUserBundle 的 symfony 2,问题是添加用户时,当前登录的用户配置文件将被当前添加的用户替换,然后当我尝试编辑其他用户配置文件时,唯一可编辑的是当前登录的用户,从 FOSUserBundle 继承的函数有问题吗?我希望在添加用户时,当前登录的用户不会随着添加的内容而改变,并且当我编辑另一个用户配置文件时,我尝试编辑的用户帐户将被编辑,而不是当前添加的用户帐户。

这是我来自 FOSUserBundle 的代码:

注册控制器: // 添加用户

public function registerAction(Request $request)

    

        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */

        $formFactory = $this->get('fos_user.registration.form.factory');

        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */

        $userManager = $this->get('fos_user.user_manager');

        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */

        $dispatcher = $this->get('event_dispatcher');



        $user = $userManager->createUser();

        $user->setEnabled(true);



        $event = new GetResponseUserEvent($user, $request);

        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);



        if (null !== $event->getResponse()) 

            return $event->getResponse();

        



        $form = $formFactory->createForm();

        $form->setData($user);



        $form->handleRequest($request);



        if ($form->isValid()) 

            $event = new FormEvent($form, $request);

            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);



            $userManager->updateUser($user);



            if (null === $response = $event->getResponse())    
                $session = $this->getRequest()->getSession();
                $session->getFlashBag()->add('message', 'Sucessfully Added');
                $url = $this->generateUrl('matrix_edi_viewUser');

                $response = new RedirectResponse($url);

            



            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));



            return $response;

        



        return $this->render('FOSUserBundle:Registration:register.html.twig', array(

            'form' => $form->createView(),

        ));

    

配置文件控制器: //用于编辑用户资料

public function editAction(Request $request)

    

        $user = $this->getUser();

        if (!is_object($user) || !$user instanceof UserInterface) 

            throw new AccessDeniedException('This user does not have access to this section.');

        



        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */

        $dispatcher = $this->get('event_dispatcher');



        $event = new GetResponseUserEvent($user, $request);

        $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event);



        if (null !== $event->getResponse()) 

            return $event->getResponse();

        



        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */

        $formFactory = $this->get('fos_user.profile.form.factory');



        $form = $formFactory->createForm();

        $form->setData($user);



        $form->handleRequest($request);



        if ($form->isValid()) 

            /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */

            $userManager = $this->get('fos_user.user_manager');



            $event = new FormEvent($form, $request);

            $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event);



            $userManager->updateUser($user);



            if (null === $response = $event->getResponse()) 

                //$url = $this->generateUrl('fos_user_profile_show');
                $session = $this->getRequest()->getSession();
                $session->getFlashBag()->add('message', 'Successfully updated');
                $url = $this->generateUrl('matrix_edi_viewUser');
                $response = new RedirectResponse($url);

            



            $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, new FilterUserResponseEvent($user, $request, $response));



            return $response;

        



        return $this->render('FOSUserBundle:Profile:edit.html.twig', array(

            'form' => $form->createView()

        ));

    

【问题讨论】:

您是否在登录时注册用户? 是的,我在登录时添加用户 【参考方案1】:

注册事件在您的方法中触发,这就是新创建的用户自动登录的原因。

为避免这种行为并保持当前用户登录状态(不对新创建的用户进行身份验证),请删除以下行:

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

这两行也是:

$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

还有这一行:

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

现在您只是在创建一个新用户,而没有告诉 FOSUserBundle 您正在注册。

更新

对于编辑部分,您必须创建一个特定的方法来重现 editProfile 的内容,但要针对给定的用户(不是经过身份验证的用户)。

尝试使用以下内容:

public function editUserAction($id)

    $user = $em->getRepository('YourBunde:User')->find($id);

    if (!is_object($user)) 
        throw new AccessDeniedException('This user does not have access to this section.');
    

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

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

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

        $session = $this->getRequest()->getSession();
        $session->getFlashBag()->add('message', 'Successfully updated');
        $url = $this->generateUrl('matrix_edi_viewUser');
        $response = new RedirectResponse($url);

    

    return $this->render('FOSUserBundle:Profile:edit.html.twig', array(
        'form' => $form->createView()
    ));

还有路线:

security_edit_profile:
    path:     /users/id/edit
    defaults:  _controller: YourBundle:Security:editUser 

【讨论】:

感谢它的工作,但编辑配置文件部分怎么样? 编辑配置文件怎么样,我怎样才能让它工作,每当我点击一个用户时,它必须是要编辑的用户而不是当前登录的用户? 我已添加更改。 它的工作原理是,当我单击特定用户时,它会重定向到带有相应信息的编辑页面,但是当开始编辑其个人资料时,它无法按预期工作,因为我想要的是例如,我只是想编辑用户的用户名并保存它,它给出的是,它会给我一个验证,例如用户的电子邮件已经被使用,我们该怎么做 你一个人问的问题太多了。您应该打开另一个,然后再查看用于 createForm 的 FormFactoryInterface。我知道您可以将表单作为部分更新 (PATCH) 处理,但您必须在课堂上找到方法。现在您已经掌握了所有信息,只需根据您的需要自定义编辑方法,它不再特定于 FOSUB,只是 Symfony 表单构建/处理的一部分【参考方案2】:

从 RegisterAction 中移除:

$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

【讨论】:

编辑配置文件怎么样,我怎样才能让它工作,每当我点击一个用户时,它必须是要编辑的用户而不是当前登录的用户?

以上是关于使用 FOS 用户包编辑用户配置文件的主要内容,如果未能解决你的问题,请参考以下文章

显示配置文件 FOS UserBundle + Sonata UserBundle

Symfony FOS 用户包 - 删除表单和视图中的用户名

FOS 捆绑包 - 如何选择具有特定角色的用户?

配置文件编辑时奏鸣曲用户捆绑错误

Symfony2 - 安装了 FOS 用户包的自定义身份验证提供程序

如何覆盖 FOS 用户捆绑表单标签