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


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

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

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

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

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

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

Author: Noy, 2014-11-16

1 answers

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

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

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

Недостатки:

  • накладные расходы на производительность из-за подзапросов
  • могут отображаться только формы, отправка формы (и последующая обработка ошибок при отправке) будут всегда переходите на страницы, предоставленные 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
    Этот макет должен визуализируйте только блок content скриптов представления FOSUserBundle и он такой короткий и простой:

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

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


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

  • Этот ответ описывает, как вручную реализовать формы и связать их с контроллером FOSUserBundle.
 3
Author: Fabian Keller, 2017-05-23 12:18:07