2017-06-24 32 views
2

我正在致力於Delete User的功能。 loged的用戶可以刪除他的帳戶,然後他將被重定向到主頁。Symfony3:如何刪除當前用戶並重定向回家?

這是使用AJAX call實施,在控制了以下行動:

/** 
* @Route("settings/delete-user/{userId}", name="delete-user") 
*/ 
public function deleteUserAction(Request $request, 
           $userId, 
           EntityManagerInterface $em, 
           TranslatorInterface $translator, 
           FormErrorCollector $errorCollector, 
           SessionInterface $session, 
           TokenStorageInterface $tokenStorage) 
{ 
    $user = $this->getUser(); 
    $deleteUserForm = $this->createForm(ConfirmPasswordType::class); 

    $deleteUserForm->handleRequest($request); 
    if($request->isXmlHttpRequest() && $user->getId() == $userId){ 

     if($deleteUserForm->isValid()){ 

      $em->remove($user); 
      $em->flush(); 

      $session->invalidate(0); 

      return new JsonResponse(array(
       'status' => 'success', 
       'message' => $translator->trans('USER_DELETED_SUCCESS') 
      )); 
     }else{ 

      $errors = $errorCollector->getErrors($deleteUserForm); 

      return new JsonResponse(array(
       'status' => 'failure', 
       'errors' => $errors 
      )); 
     } 

    }else{ 

     return new JsonResponse('FORBIDEN'); 

    } 
} 

實際上,用戶從數據庫中刪除,然後出現一個模態與確認和一個鏈接返回到主頁。問題是,當用戶點擊鏈接,Symfony的顯示此錯誤:

You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine.

顯然,Symfony的是找不到用戶,因爲我剛剛刪除它。我試圖刪除SessionTokenStorage,希望問題得到解決,但根本沒有。

那麼,如何將刪除的用戶重定向到主頁?

UPDATE

如果您使用的Symfony 3.3或以上,你可以使用自動裝配。答案的改善將是:

1.-添加使用了TokenStorageInterface:

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 

2:通TokenStorageInterface作爲參數傳遞給您的DeleteAction:

public function deleteUserAction(Request $request,$userId,TokenStorageInterface$tokenStorage) 
{ 

3.-清除令牌和會話:

$tokenStorage->setToken(null); 
$session->invalidate(); 

您還可以使用自動裝載會話服務,使用:

use Symfony\Component\HttpFoundation\Session\SessionInterface; 
+0

這是刪除必要的?退休可能是建議的方法。我的個人偏好永遠不會刪除,只是incase。 – Doug

+0

這不是絕對必要的,但個人而言,我更喜歡真正的刪除,而非數據一致性。 –

回答

0

您可以嘗試在用$this->get('security.token_storage')->setToken(null);刪除之前手動註銷用戶,例如,

/** 
* @Route("settings/delete-user/{userId}", name="delete-user") 
*/ 
public function deleteUserAction(Request $request, 
           $userId, 
           EntityManagerInterface $em, 
           TranslatorInterface $translator, 
           FormErrorCollector $errorCollector, 
           SessionInterface $session, 
           TokenStorageInterface $tokenStorage) 
{ 
    $user = $this->getUser(); 
    $deleteUserForm = $this->createForm(ConfirmPasswordType::class); 

    $deleteUserForm->handleRequest($request); 
    if($request->isXmlHttpRequest() && $user->getId() == $userId){ 

     if($deleteUserForm->isValid()){ 

      // force manual logout of logged in user  
      $this->get('security.token_storage')->setToken(null); 

      $em->remove($user); 
      $em->flush(); 

      $session->invalidate(0); 

      return new JsonResponse(array(
       'status' => 'success', 
       'message' => $translator->trans('USER_DELETED_SUCCESS') 
      )); 
     }else{ 

      $errors = $errorCollector->getErrors($deleteUserForm); 

      return new JsonResponse(array(
       'status' => 'failure', 
       'errors' => $errors 
      )); 
     } 

    }else{ 

     return new JsonResponse('FORBIDEN'); 

    } 
} 

如果您使用的是記得我的功能,請務必將答案不動產資產信託給Log user out in Symfony 2 application when "remember me" is enabled爲好,因爲事情變得更棘手一點。

+0

謝謝你的回答,我以前嘗試過,使用新的Symfony功能,自動裝配服務,但沒有工作,並使你的溶劑工作。謝謝! –

+0

我的更新顯示瞭如何使用Autowire檢索'security.token_storage'服務。 Symfony> = 3.3是必需的。 –

相關問題