Symfony 2 уникальный валидатор - PullRequest
5 голосов
/ 29 сентября 2011

Я пытаюсь проверить форму с некоторыми полями, которые должны быть уникальными - имя пользователя и адрес электронной почты. Если я отправляю форму, я получаю ошибку базы данных. Я хочу использовать валидатор, как я делал для всего остального - сейчас я пытаюсь использовать в объекте пользовательские методы получения и функции isvalidUsername, и я не уверен, что использование диспетчера сущностей в объекте - лучший способ сделать это , Вот с чем я работаю до сих пор ...

    Frontend\UserBundle\Entity\User:
         properties:
             email:
                  - NotBlank: ~
                  - Email: ~
         username:
             - NotBlank: ~
         getters:
              validUsername:
                   - "True": { message: "Duplicate User detected.  Please use a different username." }
              validEmail:
                   - "True": { message: "Duplicate email detected. Please use a different email." }

В fosuserbundle встроены уникальные валидаторы, но я не смог понять, как их использовать.

Ответы [ 3 ]

5 голосов
/ 13 марта 2012

Я знаю, что это старый вопрос, но мне просто нужно было разобраться с этим, поэтому я решил поделиться своим решением.мой ручной подход:

<?php
namespace MyCorp\CorpBundle\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/** User - Represent a User object */
class User implements AdvancedUserInterface {

    /** @var integer $id */
    private $id;

    /** @var string $email */
    private $email;

    /** Constructor, Getters, Setters etc... */

    /** Set a list of rules to use when validating an instance of this Class 
        @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */
    public static function loadValidatorMetadata(ClassMetadata $metadata) {

        $metadata->addPropertyConstraint('email', new MaxLength(255));
        $metadata->addPropertyConstraint('email', new NotBlank());
        $metadata->addPropertyConstraint('email', new Email());

        $metadata->addConstraint(new UniqueEntity(array(
            "fields" => "email", 
            "message" => "This email address is already in use")
        ));

    }

}

Как видите, я определяю свою валидацию в самой модели.Symfony позвонит loadValidatorMetadata, чтобы позволить вам загрузить валидаторы.

1 голос
/ 01 октября 2011

Прежде всего, я бы порекомендовал вам использовать FOSUserBundle . Он достаточно гибкий, и вы можете сэкономить время, которое вы потратите, исправляя незаметные ошибки и тестируя, если все действительно работает, как задумано.

В любом случае, если вы действительно хотите построить его самостоятельно, вы можете хотя бы вдохновиться пакетом, который я упоминал выше. Они определяют пользовательский валидатор и проверяют уникальность в UserManager (validateUnique). Кроме того, вы должны зарегистрировать его как сервис , чтобы обеспечить UserManager через внедрение конструктора. Тогда вы просто используете его как обычный валидатор класса .

0 голосов
/ 17 марта 2015

Существует ограничение проверки UniqueEntity для обеспечения того, чтобы пользователь предоставил уникальное значение для определенного свойства.

Пожалуйста, обратитесь к документации для примеров использования различных форматов, которые поддерживает Symfony,Вот пример использования аннотаций:

// Acme/UserBundle/Entity/Author.php
namespace Acme\UserBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

// DON'T forget this use statement!!!
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * @UniqueEntity("email")
 */
class Author
{
    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     * @Assert\Email()
     */
    protected $email;

    // ...
}
...