Один из подходов состоит в том, чтобы всегда перенаправлять:
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
}
return $this->redirect($this->generateUrl('profile'));
Конечно, вы теряете сообщения об ошибках и изменения.
Другой подход заключается в определении менеджера сущностей только для вашего UserProvider. $user
больше не будет таким же, как $entity
. Немного лишних накладных расходов, но это, безусловно, решает проблему и предотвращает подобные взаимодействия с другими формами, которые могут изменить всю или часть пользовательской сущности.
Аналогичным образом вы сокращаете накладные расходы, создавая менеджер сущностей только для формы своего профиля. При использовании этого метода накладные расходы будут возникать только при редактировании профиля.
Наконец, вы можете спросить себя, действительно ли имело значение, что отображаемые данные были не совсем правильными в данном конкретном случае. Это действительно что-то беспокоит? Кто-нибудь заметит, кроме вас?
См. Как работать с несколькими менеджерами сущностей в Symfony Cookbook
Другая идея заключается в клонировании вашей пользовательской сущности в вашем провайдере. Это отделит его от менеджера сущностей.
Вы также можете использовать $entityManager->detach($user);
для удаления пользователя из менеджера сущностей.
И почему пользователь токена в любом случае является сущностью? Рассмотрите возможность создания полностью независимого класса User с минимальным объемом информации, извлекаемой из базы данных вашим провайдером. Это то, что я делаю.