Symfony2错误定位错误

时间:2014-06-25 16:44:09

标签: forms symfony symfony-2.5

我正在使用FOSUserBundle来注册用户。但错误出现在一个奇怪的地方。

它们出现在密码字段行中,而不是用户名或电子邮件

form errors

正如您所看到的那样,错误会显示在“密码”旁边,而不是“用户名”和“电子邮件”。 HTML显示错误位于“密码”行中,而不仅仅位于“用户名”行的底部。

为什么会这样?

我使用了fields.html.twig并添加了此内容;

{% block form_row %}
    {% spaceless %}
        <div class="form-group">           
            {{ form_errors(form) }}         
            {{ form_label(form) }}
            {{ form_widget(form) }}
        </div>
    {% endspaceless %}
{% endblock form_row %}

这样可行,但错误都出现在密码form-group div。

视图文件在Resources/views/Registration/register_content.html.twig

中看起来像这样
<form role="form" action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="form-horizontal fos_user_registration_register">
    {{ form_widget(form) }}

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <input type="submit" class="btn btn-info" value="{{ 'registration.submit'|trans }}" />
        </div>
    </div>
</form>

如何将它们移动到各自的div中或将它们移动到表单的开头?

我也有这个validation.yml文件,可能值得注意

FOS\UserBundle\Model\User:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: {fields: username, message: "This username is taken" }
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: {fields: email, message: "This email is taken" }

2 个答案:

答案 0 :(得分:1)

{{ form_errors(form) }}呈现附加到表单的错误。它们显示在上次提到{{ form_errors(form) }}的位置,位于password div内。

您的表单字段似乎已将error_bubbling设置为true。如果您希望在元素旁边显示错误,请不要使用error_bubbling

此外,您可以在Resources/views/Registration/register_content.html.twig模板中单独呈现字段。我会删除fields.html.twig并将Resources/views/Registration/register_content.html.twig更改为以下内容:

<form role="form" action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="form-horizontal fos_user_registration_register">

    {{ form_errors(form) }}

    <div class="form-group">
        {{ form_errors(form.email) }}
        {{ form_label(form.email) }}
        {{ form_widget(form.email) }}
    </div>

    <div class="form-group">
        {{ form_errors(form.username) }}
        {{ form_label(form.username) }}
        {{ form_widget(form.username) }}
    </div>

    <div class="form-group">
        {{ form_label(form.plainPassword.first) }}
        {{ form_widget(form.plainPassword.first) }}
        {{ form_errors(form.plainPassword.first) }}
    </div>

    <div class="form-group">
        {{ form_label(form.plainPassword.second) }}
        {{ form_widget(form.plainPassword.second) }}
        {{ form_errors(form.plainPassword.second) }}
    </div>

    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <input type="submit" class="btn btn-info" value="{{ 'registration.submit'|trans }}" />
        </div>
    </div>

    {{ form_rest(form) }}

</form>

答案 1 :(得分:1)

当前Symfony 2.5 中的验证组存在错误,这让我发疯。见this question。您可以通过在config.yml中强制执行先前的验证API来解决此问题:

framework:
    validation:
        enable_annotations: true
        api: 2.4 # default is auto which sets broken API 2.5

为了拯救我的理智而对@gremo的所有赞誉。