FOSUserBundle压倒不连贯

 手机用户2502939421 发布于 2023-01-31 12:13

我遇到了关于FOSU​​serBundle最重要的可能性的无数问题,并且在使用Twig的继承机制时发现了一些"设计不连贯",我想澄清一下,因为它在某些项目中真的令人不安......

覆盖FOSUserBundle中的模板

从我读过的内容来看,我们应该如何覆盖模板.比方说,登录模板(Security/login.html.twig).首先,我需要覆盖全局FOSUser布局(layout.html.twig').

全球FOSUser布局

{% extends "::layout.html.twig" %}
{% block title %}Page title{% endblock title %}
{% block body %}
    
{% block fos_user_content %}{% endblock %}
{% endblock body %}

titlebody块到HTML引用</code>和<code><body></code>标签(全球).现在,谈到登录本身,这就是我写的内容.</p> <p><strong>登录表格</strong></p> <pre class="brush:bash;">{% extends "MyUserBundle::layout.html.twig" %} {% block fos_user_content %} {% if error %} <div class="error">{{ error|trans({}, 'FOSUserBundle') }}</div> {% endif %} <form action="{{ path("fos_user_security_check") }}" method="post"> <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" /> <label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label> <input type="text" id="username" name="_username" value="{{ last_username }}" required="required" /><br /> <label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label> <input type="password" id="password" name="_password" required="required" /><br /> <input type="checkbox" class="checkbox" id="remember_me" name="_remember_me" value="on" /> <label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label><br /> <label for="_submit"></label> <input type="submit" class="submit" id="_submit" name="_submit" value="{{ 'security.login.submit'|trans({}, 'FOSUserBundle') }}" /> </form> {% endblock fos_user_content %} </pre> <p>现在,这就是我自动理解的内容:布局创建了一个环境,其他模板被"包含"在<code>fos_user_content</code>块中.登录页面的结果遵循此方案.</p> <h2>另一个尝试?注册.</h2> <p>现在,遵循这种模式,我试图扩展注册表格,思考:" <em>我应该<code>fos_user_content</code>像以前那样扩展内容!</em>猜猜是什么?不是它!这是我的<code>Registration/register_content.html.twig</code>文件.</p> <p><strong>注册表单内容</strong></p> <pre class="brush:bash;">{% extends "MyUserBundle::layout.html.twig" %} {% block fos_user_content %} <form action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register"> {{ form_widget(form) }} <div> <input type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" /> </div> </form> {% endblock %} </pre> <h2>问题</h2> <p>以前的模式似乎不适用于注册部分:当我遵循相同的方案时,我的注册页面以图形方式加倍.表格打印两次,标题也是如此......就像我在某处做了不必要的包含/继承......</p> <p>有没有人知道FOSUserBundle是不是设计了覆盖模板的通用模式?为什么我需要重建完整的继承树才能在登录和注册表单上显示类似的内容?</p> <h2>解决方案(?)</h2> <p>Cerad的回答为注册案例提供了不同的方案.Twig继承树排除<code>register_content.html.twig</code>并使用<code>register.html.twig</code>.当你看一下这个文件时,你可以看到它......包括<code>register_content.html.twig</code>.这是我所说的不连贯.为什么是这样 ?为什么不直接使用包含内容的单个文件?为什么FOS决定添加这个<em>无用的(?)</em>包含步骤?</p> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8923551941185667" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-8923551941185667" data-ad-slot="9961241226"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="q_answer"> <div class="q_answer_top">撰写答案</div> <div class="q_answer_box"> <form action="https://ask.php1.cn/?s=index/questionAnswer&id=595554" method="post"> <div class="q_answer_txt"> <textarea id="editor1" name="editor1" >回答问题...</textarea> </div> <script> var config = { extraPlugins: 'codesnippet', codeSnippet_theme: 'monokai_sublime', height: 200 }; CKEDITOR.replace( 'editor1', config ); </script> <div class="q_answer_bt"> <input type="submit" value="提交回答"> </div> </form> </div> </div> </div> <div class="ask_main_right"> <div class="ask_add_tips"> <div class="ask_add_title">今天,你开发时遇到什么问题呢?</div> <a href="https://ask.php1.cn/?s=index/add"><div class="ask_add_bt">立即提问</div></a> </div> <div class="ask_tags"> <div class="ask_tags_title">热门标签</div> <div class="ask_tags_list"> <ul> <div style="clear:both"></div> </ul> </div> </div> </div> <div style="clear: both"></div> </div> <div style="clear: both"></div> <div class="bottom"> PHP1.CN | 中国最专业的PHP中文社区 | <a href="https://www.php1.cn/pngimg/" target="_blank" title="PNG素材下载">PNG素材下载</a> | <a href="https://devbox.cn/" target="_blank" title="DevBox开发工具箱">DevBox开发工具箱</a> | <a href="https://www.json1.cn/" target="_blank" title="json解析格式化">json解析格式化</a> |<a href="https://news.php1.cn/" title="PHP资讯">PHP资讯</a> | <a href="https://school.php1.cn/" title="PHP教程">PHP教程</a> | <a href="https://database.php1.cn/" title="数据库技术">数据库技术</a> | <a href="https://server.php1.cn/" title="服务器技术">服务器技术</a> | <a href="https://web.php1.cn/" title="前端技术">前端开发技术</a> | <a href="https://www.php1.cn/phpframework.html" title="PHP框架">PHP框架</a> | <a href="https://tools.php1.cn/">开发工具</a> | <a href="https://www.json1.cn/tools/" title="在线工具">在线工具</a><BR /> Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802041100" style="color:#444;"><img src="https://img.json1.cn/3cd4a/21981/c5a/4df0b47476da9030.png"/>京公网安备 11010802041100号</a> | <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备19059560号-4</a> | PHP1.CN 第一PHP社区 版权所有 <BR />       </div> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'https://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <script type="text/javascript" src="//js.users.51.la/21559097.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushBash.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCpp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCSharp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushCss.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushDelphi.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushDiff.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushGroovy.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushJava.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushJScript.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPhp.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPlain.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushPython.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushRuby.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushScala.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushSql.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushVb.js"></script> <script type="text/javascript" src="/style/SyntaxHighlighter/scripts/shBrushXml.js"></script> <link type="text/css" rel="stylesheet" href="/style/SyntaxHighlighter/styles/shCore.css"/> <link type="text/css" rel="stylesheet" href="/style/SyntaxHighlighter/styles/shThemeLiuQing.css"/> <style> .syntaxhighlighter{ width: 600px; padding-top:40px;padding-bottom:20px; border: 1px solid #333; background: url("/style/SyntaxHighlighter/top_bg.svg"); background-size: 43px; background-repeat: no-repeat; margin-bottom: -7px; border-radius: 15px; background-position: 16px 12px; } .gutter{ display: none; } </style> <script type="text/javascript"> SyntaxHighlighter.all(); </script> </body> </html>