Symfony 2 уникальный валидатор

5

Я пытаюсь проверить форму с некоторыми полями, которые должны быть уникальными - имя пользователя и адрес электронной почты. Если я отправлю форму, я получаю ошибку базы данных. Я хочу использовать валидатор, как я сделал для всего остального - прямо сейчас я пытаюсь использовать пользовательские функции getters и 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 встроены уникальные валидаторы, но я не смог понять, как их использовать.

Теги:
validation
forms

3 ответа

5

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

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

<?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, чтобы вы могли загрузить валидаторы.

  • 0
    Это сработало для меня. Может быть, в этом случае лучше использовать FOSUserBundle, но я просто хотел наложить валидатор уникальности на что-то, не связываясь со всем этим прямо сейчас, и это помогло. Благодарю.
  • 0
    Я обнаружил, что, похоже, проблема с этим решением: если вы попытаетесь обновить существующую запись пользователя, вы получите сообщение об ошибке, в котором говорится, что адрес электронной почты уже используется, что, конечно, не должно произойти.
Показать ещё 2 комментария
1

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

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

0

Существует ограничение проверки 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;

    // ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню