Symfony2 fos логин, зарегистрируйтесь и забыли пароль в одном представлении

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

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

Мои постоянные варианты (как я их вижу), и почему я не люблю их:

  1. Возьмите взгляды из пакета fos, скопируйте их в /app/Resources/FOSUserBundle/views/ , удалите часть {% extend %} и {% include %} в моем собственном окне входа в систему. Причина для неприязни: для меня это выглядит немного как быстро-грязное исправление – «эта часть не работает? Давайте ее сломаем!» 🙂
  2. Расширьте пакет fos, примите дополнительный параметр в LoginAction и RegisterAction , используйте {% render %} с параметрами в моем собственном LoginAction входа в систему. Причина неприязни: расширение целого пакета и изменение двух разных контроллеров, чтобы изменить способ его отображения, выглядит как плохой MVC.
  3. XHR загружает все. Причина неприязни: этот подход имеет смысл при использовании внутренних страниц, но для страниц, которые перезагружаются, это просто не имеет смысла.

Версия TL: DR: Я ищу способ без взлома, включая регистрацию, регистрацию и забытую форму пароля на одной странице.

Любая помощь будет принята с благодарностью!

Related of "Symfony2 fos логин, зарегистрируйтесь и забыли пароль в одном представлении"

Я нашел решение, с которым мне нравится мой текущий проект. Преимущества и недостатки предлагаемого решения:

Преимущества:

  • несколько LOC для реализации
  • FOSUserBundle update proof (не переопределяет сценарии просмотра *)

Недостатки:

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

* нужно только переопределить файл layout.html.twig


С учетом сказанного, вот что я сделал:

  1. Оформить форму в шаблоне
    Используйте встроенные контроллеры для визуализации форм, которые вам нужны:

     <div> <h2>Login</h2> {{ render(controller('FOSUserBundle:Security:login', { embeddedForm: true})) }} </div> <div> <h2>Reset</h2> {{ render(controller('FOSUserBundle:Resetting:request', { embeddedForm: true})) }} </div> 
  2. Переопределить макет FOSUserBundle
    Поскольку я использую маршруты, предоставляемые пакетом, мне пришлось переопределить файл шаблона макета FOSUserBundle, чтобы расширить стандартный макет моего приложения. Поскольку переопределенный файл макета FOSUserBundle расширяет файл макета основного приложения, макет будет повторяться для каждого вызова {{ render ... }} . Чтобы этого избежать, нам необходимо динамически отключить расширенный файл макета. Вот как выглядит внешний файл макета:

     {# app/Resources/FOSUserBundle/views/layout.html.twig #} {% if app.request.get('embeddedForm') %} {% set layout = 'AcmeBundle::layout-content.html.twig' %} {% else %} {% set layout = 'AcmeBundle::layout.html.twig' %} {% endif %} {% extends layout %} {% block content %} {% block fos_user_content %}{% endblock %} {% endblock %} 
  3. Создайте AcmeBundle::layout-content.html.twig file
    Этот макет должен только отображать блок содержимого сценариев просмотра FOSUserBundle и такой короткий и простой:

     {# src/Acme/DemoBundle/Resources/views/layout-content.html.twig #} {% block content %}{% endblock %} 

Теперь формы будут хорошо отображаться со всеми зависимостями (CSRF и т. Д.). Однако отправка формы приведет вас к действиям FOSUserBundle.


Альтернативное решение:

  • Этот ответ описывает, как вручную реализовать формы и связать их с контроллером FOSUserBundle.