我需要将购买的模板应用到我们的仪表板。在这个模板中,login、register 和forgot password 表单都在同一个 View 下,并使用简单的 JQuery 在它们之间切换。
我一直在寻找一种将所有三种形式组合成一个的不错的、不太花哨的方法,但我一无所获。
我的常设选项(如我所见),以及我不喜欢其中任何一个的原因:
- 从 fos 包中取出 View ,将它们复制到
/app/Resources/FOSUserBundle/views/
,删除{% extend %}
部分和{% include %}
它们在我自己的登录 View 中。 不喜欢的原因:对我来说,这看起来有点像快速修复 - “那个部分不起作用?让我们把它拆掉!” :) - 扩展 fos 包,在
LoginAction
和RegisterAction
中接受一个额外的参数,在我自己的参数中使用{% render %}
登录 View 。 不喜欢的原因:扩展整个包并修改两个不同的 Controller 只是为了改变它呈现的方式,感觉就像糟糕的 MVC。 - XHR 加载一切。 不喜欢的原因:这种方法在使用内页时很有意义,但对于无论如何都要重新加载的页面来说就没有意义了。
TL;DR version:我正在寻找一种非黑客方式,将登录、注册和忘记密码表单包含在一个页面中。
如有任何帮助,我们将不胜感激!
最佳答案
我找到了适合我当前项目的解决方案。预先提出的解决方案的优缺点:
优点:
- 需要实现的 LOC 很少
- FOSUserBundle 更新证明(不覆盖 View 脚本*)
缺点:
- 由于子请求导致的性能开销
- 只能显示表单,表单提交(以及随后的提交错误处理)将始终转到 FOSUserBundle 提供的页面
- 仍然感觉像是一种快速修复,但比其他选择更好
* 只需要覆盖layout.html.twig文件
话虽如此,这是我所做的:
在您的模板中呈现表单
使用 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>
覆盖 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 %}
创建
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/