Я пытаюсь связать своих локальных пользователей, хранящихся в базе данных, с некоторыми внешними службами, чтобы они могли войти в любое место с одинаковыми учетными данными.
У меня есть EventListener, ожидающий некоторых FOSUserEvents, таких как FOSUserEvents::REGISTRATION_SUCCESS
или же FOSUserEvents::CHANGE_PASSWORD_SUCCESS
Вызывается, когда данные действительны, но фактически не сохранены, чтобы выполнить некоторый вызов различным внешним службам и реплицировать учетные данные нового пользователя.
Если службы возвращают сообщение о том, что данные реплицированы, все работает нормально.
Но если служба скажет, что есть проблема, не важно, что это такое, я бы хотел прервать процесс сохранения формы и добавить сообщение об ошибке.
Цель состоит в том, чтобы предотвратить сохранение данных в Symfony, даже если они действительны, если внешняя служба скажет no
и я не знаю, как выполнить такую аварийную остановку.
На самом деле, он основан только на FOSUserBundle, но если я найду работающее решение, мне придется выполнить нечто подобное для других сущностей, поэтому я стараюсь быть как можно более универсальным.
Вот некоторые из моего кода
class MyListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_SUCCESS => 'createUser',
FOSUserEvents::CHANGE_PASSWORD_SUCCESS => 'editUser'
);
}
public function createUser(FormEvent $event)
{
$user = $event->getForm()->getData();
// Check if the user exists before trying to edit
$result = $this->_userExists($user);
if($result['value'] == false)
{
// Create the user
$result = $this->_createUser($user);
// Check if the user is successfully replicated
if($result['result'] != 'success')
{
/*
* Emergency stop (user not replicated)
*/
}
}else{
/*
* Emergency stop (user doesn't exists)
*/
}
}
. . .
}
На самом деле я не нашел способа остановить сохранение рабочего процесса и вернуться на страницу формы, чтобы отобразить сообщение об ошибке. Так что, если у кого-то есть идея, как это сделать, не стесняйтесь, напишите свою идею и спасибо всем вам, ребята. Stackoverflow действительно лучший 😉
Задача ещё не решена.
Других решений пока нет …