Форма входа и регистрации Symfony3 в одном шаблоне на FOSUserBundle


Мне нужно разместить на одной странице форму входа и регистрационную форму. Я использую Symfony 3.2 и пользовательский пакет FOS.

Я нашел это: Как объединить форму входа и регистрации в одном шаблоне на FOSUserBundle

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

Я попытался переопределить контроллеры fos, чтобы выполнить перенаправление при ошибке проверки формы, но перенаправление приводит к потере сообщений о проверке.

Я также попытался перенаправить запрос в оба fos Контроллер безопасности и контроллер регистрации (например, так: http://symfony.com/doc/current/controller/forwarding.html ) но для проверки действия входа в систему я получаю: Исключение RuntimeException "Вы должны настроить путь проверки для обработки брандмауэром с помощью form_login в конфигурации брандмауэра безопасности".. Он уже настроен и работал, но перенаправление запроса непосредственно на контроллер, похоже, нарушает его (я не мог понять, как выполняется проверка входа в систему действительно, поскольку метод проверки возвращает только исключение времени выполнения)

Последнее решение, которое я мог придумать, - это создать обе формы в новом контроллере, но я не знаю, как вызвать проверку входа пользователя в систему fos вручную (для регистрации я мог бы просто скопировать все действие регистрации из RegistrationController).

Спасибо, что уделили мне время.

Author: monstercode, 2017-05-31

1 answers

Хорошо, я наконец-то смог заставить его работать. Я создал новый контроллер, который отображает форму входа и регистрационную форму, используя выходные данные контроллеров fos. Маршрут действия формы входа - login_check, маршрут действия формы регистрации совпадает с маршрутом контроллера (значение frontend_login)

Контроллер:

/**
 * @Route("/ingresar", name="frontend_login")
 * @Method({"GET", "POST"}) 
 */
public function loginAndRegisterAction(Request $request){

    $login_response = $this->forward('FOSUserBundle:Security:login', array( $request ));
    $register_response = $this->forward('FOSUserBundle:Registration:register', array( $request ));

    return $this->render('frontend/usuario/login_register.html.twig', array(
        'login' => $login_response->getContent(),
        'register' => $register_response->getContent(),
        ));
}

В шаблоне, отображающем содержимое, отобразите его в исходном виде (контроллеры возвращают формы, уже обработанные в формате html в его содержании)

{{ login|raw }}
{{ register|raw }}

Мне нужно переопределить шаблоны FOSUserBundle, чтобы не расширять макет fosuserbundle. Ресурсы/FOSUserBundle/layout.html.ветка:

{% block fos_user_content %}{% endblock fos_user_content %}

Настройте security.yml, чтобы указать, что путь входа в систему является тем путем, который мы определили для контроллера. При ошибке он отобразит маршрут frontend_login.

frontend:
        pattern: ^/
        context: website
        form_login:
            provider: fos_userbundle
            login_path: frontend_login
            check_path: login_check

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

{{ form_start(form, {'method': 'post', 'action': path('frontend_login'), 'attr': {'class': 'fos_user_registration_register', 'novalidate': 'novalidate'}}) }}
    {{ form_widget(form) }}
    <div>
        <input type="submit" value="Submit" />
    </div>
{{ form_end(form) }}
 0
Author: monstercode, 2017-06-01 13:11:36