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


Edit user profile using FOS User Bundle

我正在使用带有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()
        ));
    }

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

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

$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 }

从注册操作中删除:

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