FOSUserBundle - проверка полей имени пользователя, пароля или электронной почты

В FOUserBundle я хотел бы иметь возможность изменять параметры проверки минимальной длины, максимальной длины и не пустые поля, такие как имя пользователя и пароль.

Мне удалось выполнить некоторую проверку с помощью @Assert в моих настраиваемых полях, но теперь мне интересно, как я могу изменить проверку имени пользователя для FOSUserBundle?

Эти поля генерируются автоматически, поэтому я не могу добавить их в свой объект User... и по умолчанию он позволяет использовать символы типа {^| и т.д., которые не выглядят хорошо.

Ответ 1

Вы можете перезаписать настройки по умолчанию, создав новый файл проверки в своем комплекте. Это наследование пакетов. Просто скопируйте (не вырезайте).

FOSUserBundle/Resources/config/validation/orm.xml до YourBundle/Resources/config/validation/orm.xml.

(couchdb.xml, mongodb.xml, propel.xml соответственно)

и настройте его на свои нужды. Измените имя класса, затем добавьте ограничения:

<class name="Vendor\YourBundle\Model\User">

    <property name="username">
        <!-- minimum length for username -->
        <constraint name="MinLength">
            <option name="limit">3</option>
            <option name="message">Your name must have at least {{ limit }} characters.</option>
        </constraint>
        <!-- custom constraint -->
        <constraint name="Acme\DemoBundle\Validator\Constraints\ContainsAlphanumeric" />
    </property>

    <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity">
        <option name="fields">usernameCanonical</option>
        <option name="errorPath">username</option>
        <option name="message">fos_user.username.already_used</option>
        <option name="groups">
            <value>Registration</value>
            <value>Profile</value>
        </option>
    </constraint>

    <constraint name="Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity">
        <option name="fields">emailCanonical</option>
        <option name="errorPath">email</option>
        <option name="message">fos_user.email.already_used</option>
        <option name="groups">
            <value>Registration</value>
            <value>Profile</value>
        </option>
    </constraint>
</class>

Подробнее о доступных ограничениях (и о том, как их использовать с конфигурацией xml) в Ссылка на ограничения проверки.

Ответ 2

Самое легкое для меня было переписать свойство в моей настраиваемой сущности и изменить настройки для утверждения:

<?php
namespace YourBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class User extends \FOS\UserBundle\Model\User
{
    // ...

    /**
    * @Assert\Length(
    *     min=8,
    *     max=4096,
    *     minMessage="user.password.short",
    *     groups={"Profile", "ResetPassword", "Registration", "ChangePassword"}
    * )
    */
    protected $plainPassword;

    // ...
}

Не забывайте о группах проверки.

Heads up: user.password.short перевод находится в домене validators вашего пакета в YourBundle\Resources\translations\.

Пример:

# validators.en.yml
user:
    password:
        short: Password must be at least 8 characters long.

Не знаю, зависит ли это от версии; Я использую symfony v2.8.3 и fosuser [email protected] (a39d000).

Ответ 3

В YML вы сделаете так:

# src/Acme/ProjectBundle/Resources/config/validation.yml
Acme\ProjectBundle\Entity\User:
    properties:
        email:
            - Length:
                min: 5
                minMessage: "Your email must have at least {{ limit }} characters."
                max: 255
                maxMessage: "Your email is too long."
            - NotBlank:
                message: "Please enter an email"
        username:
            - Length:
                min: 6
                minMessage: "Your username must have at least {{ limit }} characters."
                max: 255
                maxMessage: "Your username is too long."
            - NotBlank:
                message: "Please enter an username"
        plainPassword:
            - Length:
                min: 8
                minMessage: "Your password must have at least {{ limit }} characters."
                max: 255
                maxMessage: "Your password is too long."
            - NotBlank:
                message: "Please enter a password"

Acme\ProjectBundle\Form\Model\ChangePassword:
    properties:
        new:
            - Length:
                min: 8
                minMessage: "Your password must have at least {{ limit }} characters."
                max: 255
                maxMessage: "Your password is too long."
            - NotBlank:
                message: "Please enter a password"

Acme\ProjectBundle\Form\Model\ResetPassword:
    properties:
        new:
            - Length:
                min: 8
                minMessage: "Your password must have at least {{ limit }} characters."
                max: 255
                maxMessage: "Your password is too long."
            - NotBlank:
                message: "Please enter a password"