Почему моя форма перенаправляется только иногда?


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

Настройка

У меня есть маршрут 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, но это, похоже, не изменилось вещи.

Фактический вопрос(-ы)

Почему форма изначально не соответствует перенаправлению, которое я установил в обработчике отправки? Почему очистка кэша изменяет это поведение?

Author: Xaq, 2018-04-12

1 answers

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

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

Кстати, почему вы не перенаправляете по строке запроса назначения, которую вы можете установить по ссылке регистрации пользователя, тогда вам не нужен код?

 0
Author: 4k4, 2018-04-13 06:48:02