2017-06-24 25 views
2

私はDelete Userの機能に取り組んでいます。ログに記録されたユーザーは自分のアカウントを削除することができます。その後、彼はホームページにリダイレクトされます。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'); 

    } 
} 

実際には、ユーザーがデータベースから削除され、その後、確認してホームページに戻るためのリンクをモーダルに表示されます。

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は私はちょうどそれを削除したため、ユーザーを見つけることができません。問題は、ユーザーがリンクをクリックしたとき、symfonyはこのエラーを示すことです。私はSessionTokenStorageを取り除こうとしましたが、問題は修正されるが、まったく修正されないことを望んでいた。

削除したユーザーをホームページにリダイレクトするにはどうすればよいですか。

UPDATE

あなたはsymfonyの3.3以上を使用している場合は、Autowireを使用することができます。その答えの改善は、次のようになります。

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

セッションサービスでautowireを使用することもできます。

あなたは、例えば、 $this->get('security.token_storage')->setToken(null);を削除する前に、手動でユーザーをログアウトしようとすることができます
use Symfony\Component\HttpFoundation\Session\SessionInterface; 
+0

削除が必要ですか?退職はおそらくアドバイスされた方法です。私の個人的な好みは決して削除しないでください。 – Doug

+0

これは絶対に必要なわけではありませんが、個人的には、データの一貫性を優先して実際の削除を優先します。 –

答えて

0

あなたは私を覚えている機能を使用している場合は、物事はもう少しトリッキー得るよう

/** 
* @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に答えをreatしてください。

+0

あなたの答えをありがとう、私はこれまで、新しいSymfony機能を使用して、サービスをautowiringしていましたが、うまくいきませんでした。ありがとうございました! –

+0

私のアップデートは、Autowireを使って 'security.token_storage'サービスを取得する方法を示しています。 Symfony> = 3.3が必要です。 –

関連する問題