Duplicated password validation messages ONLY IF new password is 1 char long

99封情书 提交于 2019-12-13 16:09:10

问题


My problem is password validation message appears twice in Registration and Change Password forms. As most posts/solutions points out "groups", how do I implement it into my code below? I tried to implement other solved examples as shown below but I cannot get it working. Maybe because I never worked FOSUserBundle before.

  • FOSUserBundle - Validation for username, password or email fields
  • Duplicated errors for constraints when using several validation groups
  • Symfony2 FOSUserBundle extending registration form causes duplicate email to validate
  • validating fosuserbundle registration form
  • Validation of a form - I'm getting the labels two times

myapp/app/config/config.yml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: WebsiteBundle\Entity\User
    model_manager_name: websitemanager
    registration:
        form:
            type: website_user_registration
    change_password:
        form:
            type: fos_user_change_password
            validation_groups:  [ChangePassword, Default]

WebsiteBundle/Resources/translations/validators.en.yml

fos_user:
    password:
        short: "[-Inf,Inf]The password must contain at least 8 characters"

services.xml

<service id="myapp_website.registration.form.type"
              class="myapp\WebsiteBundle\Form\Type\RegistrationFormType">
      <tag name="form.type" alias="website_user_registration" />
      <argument>myapp\WebsiteBundle\Entity\User</argument>
</service>

WebsiteBundle/Form/Type/RegistrationFormType.php

namespace myapp\WebsiteBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
use Symfony\Component\Validator\Constraints\IsTrue;

class RegistrationFormType extends BaseType
{
    public function __construct($class)
    {
        parent::__construct($class);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add(
            'terms',
            'checkbox',
            [
                'label' => 'Older than 18',
                'constraints' => [
                    new IsTrue([
                        'message' => 'Are you older than 18?',
                    ]),
                ],
                'required' => true,
                'mapped' => false,
            ]
        );
    }

    public function getName()
    {
        return 'website_user_registration';
    }
}

validation.xml

<?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="FOS\UserBundle\Model\User">

        <property name="plainPassword">
            <constraint name="NotBlank">
                <option name="message">fos_user.password.blank</option>
                <option name="groups">
                    <value>Registration</value>
                    <value>ResetPassword</value>
                    <value>ChangePassword</value>
                </option>
            </constraint>
            <constraint name="Length">
                <option name="min">8</option>
                <option name="minMessage">fos_user.password.short</option>
                <option name="groups">
                    <value>Registration</value>
                    <value>Profile</value>
                    <value>ResetPassword</value>
                    <value>ChangePassword</value>
                </option>
            </constraint>
        </property>
        <property name="email">
            <constraint name="NotBlank">
                <option name="message">Please enter your email address</option>
                <option name="groups">
                    <value>Registration</value>
                    <value>Profile</value>
                </option>
            </constraint>
        </property>
        <property name="username">
            <constraint name="NotBlank">
                <option name="message">Please enter your name</option>
                <option name="groups">
                    <value>Registration</value>
                    <value>Profile</value>
                </option>
            </constraint>
        </property>

    </class>

</constraint-mapping>

Twig

{% trans_default_domain 'FOSUserBundle' %}

<form action="{{ path('fos_user_change_password') }}" {{ form_enctype(form) }} method="POST">
    {{ form_row(form.current_password, {'label': 'Current Password'}) }}
    {{ form_row(form.plainPassword.first, {'label': 'New Password'}) }}
    {{ form_row(form.plainPassword.second, {'label': 'Confirm Password'}) }}
    {{ form_rest(form) }}

    <br /><input id="submit" type="submit" value="Change password" />
</form>

HTML result

<label for="fos_user_registration_form_plainPassword_first">Password</label>
<input type="password" id="fos_user_registration_form_plainPassword_first" name="fos_user_registration_form[plainPassword][first]" required="required" />

<label for="fos_user_registration_form_plainPassword_second">Confirm password</label>
<input type="password" id="fos_user_registration_form_plainPassword_second" name="fos_user_registration_form[plainPassword][second]" required="required" />

Errors When I have validators.en.yml in code-base.

When I remove validators.en.yml from code-base.


回答1:


Have a look at the group_sequence feature for validations.

# src/AppBundle/Resources/config/validation.yml
AppBundle\Entity\User:
    group_sequence:
        - User
        - Strict
    getters:
        passwordLegal:
            - 'IsTrue':
                message: 'The password cannot match your username'
                groups: [Strict]
    properties:
        username:
            - NotBlank: ~
        password:
            - NotBlank: ~

In this example, it will first validate all constraints in the group User (which is the same as the Default group). Only if all constraints in that group are valid, the second group, Strict, will be validated.

This is taken straight of the Symfony documentation at http://symfony.com/doc/current/book/validation.html#group-sequence

However personally I could never get this feature to work.



来源:https://stackoverflow.com/questions/34631172/duplicated-password-validation-messages-only-if-new-password-is-1-char-long

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!