Symfony 2: Как предотвратить одновременное редактирование одной и той же формы несколькими пользователями? - PullRequest
0 голосов
/ 20 сентября 2018

В моем SF-приложении у меня есть «обычная» форма (сгенерированная с помощью formType в контроллере).

Допустим, пользователь user1 редактирует форму A, и ее заполнение занимает несколько минут.В этот период user2 также редактирует форму A.Вы можете догадаться, что последний пользователь, который нажал «отправить», выигрывает, а другой теряет все, что он заполнил.

Как я могу предотвратить это?Это не случай многократной отправки (одним и тем же пользователем).

Я не знаю, возможно ли это и как лучше всего это реализовать, но я предполагаю добавить некоторый механизм "блокировки".

Я прочитал https://www.doctrine -project.org / projects / doctrine-orm / en / latest / reference / Transactions-and-concurrency.html # lock-support

Достаточно ли будет добавить @Version в поле в сущности для моей Формы, а SF позаботится об остальном?

Мне бы хотелось, чтобы, когда user2 пытается открыть форму, я мог отправитьсообщение: «Извините, пользователь1 уже заполняет форму» .Я не хочу, чтобы user2 терял все, что он заполняет, только когда нажимает на submit.

Спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

То, что вы пытаетесь достичь, не предоставляется из коробки фреймворком.

Что вы можете сделать, так это воспользоваться Lock Component или реализовать подобное решение самостоятельно,

// Symfony\Component\Lock\Factory $factory

$lock = $factory->createLock('your-amazing-form-USER-ID');

if (!$lock->acquire()) {
    // Sorry, user1 is already completing the form
    // throw exception or render a template for example
}

// Do what you need to show the form.

// Form is submitted and valid? Do what you need and release the lock.
if ($form->submited()) {
    // Save to database
    $lock->release();
}

Хорошей идеей является присвоение TTL блокировке, чтобы, если пользователь не отправил форму, блокировка все еще была снята.Поскольку вы все еще хотите, чтобы пользователь, получивший блокировку, мог отправить форму, имя ресурса должно содержать, например, идентификатор пользователя.

...