Задать вопрос
lucchese
@lucchese
Symfony2 Development

Как проверять формы на symfony2?

Есть форма смены емейла на symfony2:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('newEmail', 'email', array(
                'required' => true,
                'constraints' => array(
                    new NotBlank(),
                    new Email(),
                )
            ));
    }


В БД есть 2 колонки, первая email (емейл который подтвержденный и используется пользователем).

Есть new_email (емейл на который мы хотим поменять но он ожидает подтверждения).

1. у меня имейл a@site, у кого-то другого b@site
2. я через форму смены имейла могу ввести b@site и оно сменит

Мне нужно, чтобы оно проверяло, чтобы емейл никем не использовался.
Может что в сущность добавить? Нужно какую-то анатацию.
  • Вопрос задан
  • 2901 просмотр
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@v_prom
Может просто сделать в базе поле уникальным и отлавливать ошибку при записи?

/**
* @ORM\Column(name="email_address", unique="true")
*/
protected $email;
Ответ написан
Комментировать
GHua
@GHua
Если:
email - текущий адрес;
new_email - новый но не подтвержденный.

1. Можно проверять уникальность на этапе записи в new_email. Но тогда нужно сделать свой валидатор который значение будет брать из new_email, а проверять по первичному полю email.

2. Можно на этапе подтверждения, записав в email значение из new_email, а первое сделать уникальным. Как сказал @v_prom, дополнительно прописав UniqueEntity по полю email.
Ответ написан
Комментировать
А если сделать небольшой контролер который будет отвечать на AJAX запрос.
В контролере будет проверяться есть ли уже такой емейл в БД, и соответственно отправляться ответ true или false.
AJAX отправлять после того как пользователь перешел к заполнению следующего поля формы или через 5 секунд после последнего введенного символа. И в зависимости от ответа на AJAX что-то делать с формой, например подсвечивать красным или зеленым.
Ну и дополнительно сделать то что написал @v_prom
Ответ написан
Комментировать
Quber
@Quber
PHP Team lead
В свой entity добавьте/измените поле

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* @ORM\Column(unique=true)
*/
protected $email;

/** 
* @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata
*/
public static function loadValidatorMetadata(ClassMetadata $metadata) {
    $metadata->addConstraint(new UniqueEntity(array(
        "fields" => "email",
        "message" => "Данный email уже используется. Введите пожалуйста другой.")
    ));
}


public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', 'email', array(
                'required' => true,
                'constraints' => array(
                    new NotBlank(),
                    new Email(),
                )
            ));
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы