Почему моя форма перенаправляется только иногда?
Я хочу, чтобы пользователь зарегистрировался и был перенаправлен на форму создания узла. Вот как я это делаю до сих пор.
Настройка
У меня есть маршрут my_module.register
, который обрабатывается MyController::register()
. Он возвращает форму регистрации пользователя, например:
class MyController extends ControllerBase {
public function register() {
return $this->entityFormBuilder->getForm(User::create([]), 'register');
}
}
У меня также есть эта услуга, my_module.form_alter_service
(просто притворись, что все подразумеваемые инъекции зависимостей есть):
class MyFormAlterService {
public function registerFormAlter(array &$form, FormStateInterface $form_state) {
if ($this->currentRouteMatch->getRouteName() == 'my_module.register') {
$form['actions']['submit']['#submit'][] = [$this, 'redirectToAddNode'];
}
}
public static function redirectToAddNode(array &$form, FormStateInterface $form_state) {
$form_state->setRedirect(/* imagine a node form route here */);
}
}
Я также реализовал hook_form_FORM_ID_alter()
:
function my_module_form_user_register_form_alter(array $form, FormStateInterface $form_state) {
\Drupal::service('my_module.form_alter_service')->registerFormAlter($form, $form_state);
}
Ожидаемое поведение
Я заполняю откройте форму регистрации пользователя по адресу /my_module/register
, нажмите "Отправить", и я перейду к форме добавления нужного узла.
Что происходит вместо этого
Я заполняю форму регистрации пользователя по адресу /my_module/register
и оказываюсь на своей странице редактирования пользователя.
Но затем, если я удалю этого пользователя, очищу кэш и повторю процесс с теми же учетными данными, все будет работать так, как ожидалось.
Что я знаю
- Я получаю отладочный вывод от каждой части процесса, поэтому я знаю каждая часть запущена.
- Я использую точно такой же шаблон для формы входа; идентичный код в форме изменяется, и это отлично работает.
- Я также могу получить отладочный вывод от
Drupal/user/EventSubscriber/AccessDeniedSubscriber::onException()
, который перенаправляет аутентифицированных пользователей, посещающих маршрутuser.register
, на их страницу редактирования. Поэтому я знаю, что это вызывает нежелательное перенаправление, когда происходит нежелательное перенаправление. - Я попытался удалить контекст кэша
user.roles:authenticated
из формы и добавитьuser
, но это, похоже, не изменилось вещи.
Фактический вопрос(-ы)
Почему форма изначально не соответствует перенаправлению, которое я установил в обработчике отправки? Почему очистка кэша изменяет это поведение?
1 answers
Причиной неустойчивого поведения, вероятно, является условие для текущего имени маршрута в методе изменения формы. Форма не обязательно встроена в тот же запрос, что и пользовательский контроллер, она может быть подана из кэша или встроена в запрос POST.
На данный момент у вас есть условие для имени маршрута, потому что контроллер вызывает форму регистрации по умолчанию, а изменение формы не знает, откуда она вызывается. Поэтому вам нужно сделать форму различимой, для пример другого обработчика формы, значение поля в новой сущности, прежде чем вы передадите его построителю форм или поместите код изменения формы в пользовательский класс формы, расширяющий основную пользовательскую форму.
Кстати, почему вы не перенаправляете по строке запроса назначения, которую вы можете установить по ссылке регистрации пользователя, тогда вам не нужен код?