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

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

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

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

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

Я также попытался перенаправить запрос как в fos SecurityController, так и в RegistrationController (например: http://symfony.com/doc/current/controller/forwarding.html ), но для проверки входа в систему я получаю:

RuntimeException 'Вы должны настроить путь проверки для обработки брандмауэром, используя form_login в конфигурации вашего брандмауэра безопасности.'.

Он уже настроен и работает, но пересылка запроса непосредственно на контроллер, кажется, ломает его (я не мог понять, как на самом деле обрабатывается проверка входа, поскольку метод проверки возвращает только исключение времени выполнения)

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

Спасибо за ваше время.


person monstercode    schedule 31.05.2017    source источник


Ответы (1)


Хорошо, наконец-то я смог заставить его работать. Я сделал новый контроллер, который отображает форму входа и форму регистрации, используя вывод контроллеров 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.twig:

{% 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

Наконец, переопределите шаблон, отображающий форму, чтобы маршрут действия регистрационной формы был frontend_login. Я делаю это, потому что мне нужно будет изменить структуру 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) }}
person monstercode    schedule 31.05.2017