2016-02-09 2 views
3

Я использую symfony 2 с FOSUserBundle, проблема заключается в том, что при добавлении пользователя текущий зарегистрированный профиль пользователя будет заменен на добавленного пользователя, а затем, когда я попытался изменить другой профиль пользователя , единственным редактируемым будет текущий пользователь, зарегистрированный в системе, есть ли что-то не так с унаследованной функцией от FOSUserBundle? Я хочу, чтобы при добавлении пользователя текущий пользователь не изменялся с тем, что добавляется, а также когда я редактирую другой профиль пользователя, пользовательская учетная запись, которую я пытаюсь редактировать, будет отредактирована, а не добавленная в настоящее время учетная запись пользователя.Редактировать профиль пользователя с помощью FOS User Bundle

Вот мои коды из 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() 

     )); 

    } 
+0

ли вы зарегистрировать пользователь при входе в систему? – develth

+0

да, я добавляю пользователя при входе в систему – Errorhere

ответ

4

Событие регистрации запускается в вашем методе, поэтому вновь созданный пользователь регистрируется автоматически.

Чтобы избежать этого и сохранить поведение текущего пользователя, как вошли в систему (не аутентифицировать вновь созданного пользователя), удалите следующую строку:

$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)); 

Теперь вы просто создать новый пользователь, не говоря FO SUserBundle вы регистрируетесь.

Update

Для редактирования части, вы должны создать конкретный метод воспроизводит поведение в 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 } 
+0

благодаря его работе, но как насчет части редактирования профиля? – Errorhere

+0

как насчет профиля редактирования, как я могу заставить его работать, что всякий раз, когда я нажимал на пользователя, он должен быть отредактирован пользователем, а не в настоящее время вошел в систему? – Errorhere

+0

Я добавил изменения. – chalasr

0

Удалить из Регистр:

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

как насчет профиля редактирования, как я могу заставить его работать, что всякий раз, когда я нажимал на пользователя, он должен быть пользователем, который должен быть отредактирован, а не в настоящее время вошедшим в систему? – Errorhere