Я пытаюсь проверить форму с некоторыми полями, которые должны быть уникальными - имя пользователя и адрес электронной почты. Если я отправлю форму, я получаю ошибку базы данных. Я хочу использовать валидатор, как я сделал для всего остального - прямо сейчас я пытаюсь использовать пользовательские функции 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 встроены уникальные валидаторы, но я не смог понять, как их использовать.
Я знаю, что это старый вопрос, но мне просто нужно было это решить, поэтому я решил поделиться своим решением.
Я предпочитаю не использовать какие-либо связки для обработки моих пользователей, так что это мой ручной подход:
<?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
, чтобы вы могли загрузить валидаторы.
Прежде всего, я бы рекомендовал вам использовать FOSUserBundle. Он довольно гибкий, и вы можете сэкономить время, потраченное на исправление тонких ошибок и тестирование, если все действительно работает по назначению.
В любом случае, если вы действительно хотите построить его самостоятельно, вы можете хотя бы вдохновить связкой, о которой я говорил выше. Они определяют настраиваемый валидатор и проверяют уникальность в UserManager (validateUnique
). Кроме того, вы должны зарегистрировать его как сервис, чтобы предоставить UserManager
через инсталляцию конструктора. Затем вы просто используете его как обычный валидатор классов.
Существует ограничение проверки 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;
// ...
}