php - Symfony2 fos 在一个 View 中登录、注册和忘记密码

标签 php symfony twig fosuserbundle

我需要将购买的模板应用到我们的仪表板。在这个模板中,loginregisterforgot password 表单都在同一个 View 下,并使用简单的 JQuery 在它们之间切换。

我一直在寻找一种将所有三种形式组合成一个的不错的、不太花哨的方法,但我一无所获。

我的常设选项(如我所见),以及我不喜欢其中任何一个的原因:

  1. 从 fos 包中取出 View ,将它们复制到 /app/Resources/FOSUserBundle/views/,删除 {% extend %} 部分和 {% include %} 它们在我自己的登录 View 中。 不喜欢的原因:对我来说,这看起来有点像快速修复 - “那个部分不起作用?让我们把它拆掉!” :)
  2. 扩展 fos 包,在 LoginActionRegisterAction 中接受一个额外的参数,在我自己的参数中使用 {% render %}登录 View 。 不喜欢的原因:扩展整个包并修改两个不同的 Controller 只是为了改变它呈现的方式,感觉就像糟糕的 MVC。
  3. XHR 加载一切。 不喜欢的原因:这种方法在使用内页时很有意义,但对于无论如何都要重新加载的页面来说就没有意义了。

TL;DR version:我正在寻找一种非黑客方式,将登录、注册和忘记密码表单包含在一个页面中。

如有任何帮助,我们将不胜感激!

最佳答案

我找到了适合我当前项目的解决方案。预先提出的解决方案的优缺点:

优点:

  • 需要实现的 LOC 很少
  • FOSUserBundle 更新证明(不覆盖 View 脚本*)

缺点:

  • 由于子请求导致的性能开销
  • 只能显示表单,表单提交(以及随后的提交错误处理)将始终转到 FOSUserBundle 提供的页面
  • 仍然感觉像是一种快速修复,但比其他选择更好

* 只需要覆盖layout.html.twig文件


话虽如此,这是我所做的:

  1. 在您的模板中呈现表单
    使用 embedded controllers呈现您需要的表单:

    <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 布局
    当我使用 bundle 提供的路线时,我不得不 override the FOSUserBundle layout template file扩展我的应用程序的标准布局。由于覆盖的 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 文件
    此布局应仅呈现 FOSUserBundle View 脚本的 content block ,并且非常简短:

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

现在表单将很好地呈现所有依赖项(CSRF 等)。但是,提交表单会将您带到 FOSUserBundle 操作。


替代方案:

  • This answer描述了如何手动实现表单并将它们链接到 FOSUserBundle Controller 。

关于php - Symfony2 fos 在一个 View 中登录、注册和忘记密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959973/

相关文章:

symfony - 是否可以直接访问twig模板中的Route参数?

php - 观察在页面上发出的 HTTP 请求并将其发布到 PHP 脚本

php - 使用 jQuery 或 Javascript 包含 PHP 文件

php - 如何在mysql中使用多个group by with inner join

symfony - 刷新调用不应该使旧访问 token 失效吗?

symfony - Sylius + Vagrant + Behat 不工作

json - 使用 Doctrine2 请求 JSON 类型字段中的键/值

php - Symfony 4,包括来自供应商目录的 Assets

php - Twig 中没有 Symfony 的 Assets 功能

PHP 回显表及其 CSS