7

私は登録フォームを持っています - FOSUserBundle からこれはテンプレートにあります:

{% form_theme form 'AcmeMyBundle:Form:errors.html.twig' %}

   <form class="big-spacer" action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register">
        {{ form_widget(form) }}
        <div>
            <input class="btn little-spacer" type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" />
        </div>
    </form>

ここにあるerrors.html.twig

{% block field_errors %}
    {% spaceless %}

        {% if errors|length > 0 %}

            <ul class="little-spacer nav text-error">
                {% for error in errors %}
                    <li>{{loop.index}}. {{ error.messageTemplate|trans(error.messageParameters, 'validators') }}</li>
                {% endfor %}
            </ul>

        {% endif %}
    {% endspaceless %}
{% endblock field_errors %}

TwitterBootstrap からいくつかの css クラスを追加しました。

問題は、検証のメッセージの一部を 2 回受け取ることです。

私のフォームには 4 つのフィールドがあります -ユーザー名、電子メール、パスワード、パスワードの確認

できる限り多くの検証ルールを破ろうとしましたが、出力は次のとおりです。

の場合Username:

  1. このユーザー名は既に使用されています。別のものを選択してください。
  2. ユーザー名が短すぎます - 少なくとも 2 つの記号を入力してください。
  3. ユーザー名が短すぎます - 少なくとも 2 つの記号を入力してください。

の場合email:

  1. 正しいメールアドレスを入力してください。
  2. 正しいメールアドレスを入力してください。

既に使用されている電子メールを入力すると、エラーは 1 回だけ表示されます。

  1. このメールは既に使用されています。

そしてのためにpasswords

短い場合:

  1. パスワードが短すぎます - 6 つ以上の記号を入力してください。
  2. パスワードが短すぎます - 6 つ以上の記号を入力してください。

そして、それらが一致しない場合:

  1. 入力したパスワードが一致しません。

もう 1 つの奇妙な点は、フォームを再送信しても有効ではなく、パスワードの長さに関する通知が 1 つしか表示されないことです。

  1. パスワードが短すぎます - 6 つ以上の記号を入力してください。

再送信する前は 2 人でした。

一部のエラーが 2 回表示される理由と、これを修正する方法について何か考えはありますか? 事前にどうもありがとうございました!:)


アップデート

これはC:\xampp\htdocs\Project\src\Acme\MyBundle\Entity\User.php

namespace Acme\MyBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

そしてC:\xampp\htdocs\Project\app\Resources\FOSUserBundle\translations\、ファイルをコピーしてvalidators.en.yml、その部分を削除し[-Inf, Inf]、メッセージを少し変更しました。

検証ファイルもオーバーライドしました-ここにコピーしました:

C:\xampp\htdocs\Project\src\Acme\MyBundle\Resources\config\validation.xml

パスワードの最小長のみを変更しました。それ以外は元のファイルと同じです。

私のバンドルは FOSUserBundle を拡張します:

C:\xampp\htdocs\Project\src\Acme\MyBundle\AcmeMyBundle.phpこのファイルには次のものが含まれます。

<?php

namespace Acme\BudgetTrackerBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeBudgetTrackerBundle extends Bundle
{
    public function getParent() 
    {
        return 'FOSUserBundle';
    }
}
4

2 に答える 2

13

これは既知の問題です。

ここを見てみましょう: https://github.com/symfony/symfony/issues/2605

解決策は次のとおりです。オーバーライドするプロパティの検証ルールに対して独自の検証グループを作成します。validation.xml に、いくつかの異なるルールが必要なプロパティのみを配置し、新しい検証グループで検証を定義します。

したがって、validation.xml の場合、エンティティ (Acme\MyBundle\Entity\User) の plainPassword 検証ルールのみを変更するには:

<?xml version="1.0" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="Acme\MyBundle\Entity\User"> 

        <property name="plainPassword">
            <constraint name="NotBlank">
                <option name="message">fos_user.password.blank</option>
                <option name="groups">Registration</option>
            </constraint>
            <constraint name="Length">
                <option name="min">6</option>
                <option name="minMessage">fos_user.password.short</option>
                <option name="groups">
                    <value>RegistrationAcme</value>
                    <value>ProfileAcme</value>
                </option>
            </constraint>
        </property>
    </class> 

</constraint-mapping>

そして、影響を受けるフォーム (登録とプロファイル) に対して異なる検証グループを使用していることを述べる必要があります。幸いなことに、 FOSUserBundle は良い実践例であり、 config.yml でそれらをオーバーライドできます:

fos_user:
    registration:
        form:
            validation_groups: [Default, RegistrationAcme]
    profile:
        form:
            validation_groups: [Default, ProfileAcme]
于 2013-03-20T11:23:23.050 に答える
0
# config.yml
# ...
fos_user:
    db_driver:     orm
    firewall_name: main
    user_class:    Acme\YourBundle\Entity\User
    registration:
        form:
            type: acme_user_registration
            validation_groups: [Registration]
# ... 

最後の行 ("validation_groups: [Registration]") を追加すると、エラーは 1 つだけになります。FOSUserBundle 検証のみ: 「登録」。

于 2013-12-31T08:30:12.707 に答える