Я использую symfony 2 с FOSUserBundle, проблема заключается в том, что при добавлении пользователя текущий зарегистрированный профиль пользователя будет заменен на добавленного пользователя, тогда, когда я попытался отредактировать другой профиль пользователя, единственным редактируемым будет текущий вход в систему пользователь, что-то не так с унаследованной функцией от 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 }
Удалить из RegisterAction:
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));