Symfony2, как проверить уникальность электронной почты с помощью компонента валидатора

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

Вспомогательная функция

public function csverror($value, $constraint, $rowcount, $columnname){
    $error = $this->container->get('validator')->validate($value, $constraint);
    if(count($error) !== 0){
        $this->get('session')->getFlashBag()->add('csverror', "error on line: $rowcount column: $columnname ". $error[0]->getMessage());
    }
}

и вызывая его внутри действия контроллера

$this->csverror($associativerow['email'],  array(new NotBlank(), new Length(['max' => 100]), new Email()), $rowcount, "email");

Здесь мне нужно проверить, существует ли адрес электронной почты, указанный в CSV, в базе данных, для этого я предполагаю, что UniqueEntity. С ним связан класс под названием UniqueEntityValidator. Удивительно то, что компонент Validator имеет функцию, которая автоматически проверяет языковой стандарт и отображает сообщения об ошибках на этом языке!! (я предполагаю, что это связано с объектом ConstraintViolation ). Я хотел бы использовать эту функцию вместо мягкого findOneBy() для запроса базы данных и проверки, существует ли электронное письмо и возвращается с сообщением об ошибке, используя (сравнительно) грязные файлы xliff.

так! вопрос заключается в том, как проверить уникальность электронной почты в базе данных с помощью служба проверки

редактировать: в приведенном выше коде $associativerow['email'] - это строка, но на практике я могу использовать ее как объект User, если это необходимо, вы можете иметь право предположить, что это объект сущности, если это необходимо!


person Dheeraj    schedule 24.08.2016    source источник


Ответы (1)


Боюсь, это невозможно с использованием UniqueEntity и его UniqueEntityValidator, потому что для последнего требуется объект сущности в качестве значения для проверки. В противном случае будет выброшено исключение:

"get_class() ожидает, что параметр 1 будет объектом, заданной строкой"

Вы были бы вынуждены найти экземпляр объекта для этого письма раньше, а затем передать его методу $this->csverror(...):

$object = $this->getDoctrine()->getRepository('AppBundle:User')->findOneBy(['email' => $associativerow['email']]);
$this->csverror($object, new UniqueEntity(...));

РЕДАКТИРОВАТЬ:

Если у вас есть пользовательский экземпляр, вам не нужны настройки ограничений для проверки его в вашей функции csverror. Настройте ограничения утверждения внутри вашего класса User:

use Symfony\Component\Validator\Constraints as Assert;

/**
 * ...
 * @UniqueEntity(fields={"email"}
 */
class User 
{
    //...

    /**
     * @var string
     * 
     * @Assert\NotBlank()
     * @Assert\Length(max="100")
     *
     * @ORM\Column(type="string")
     */
    private $email;

    //...
}

позже,

public function csverror($object, $rowcount){
    $error = $this->container->get('validator')->validate($object);
    // ...
}

и,

$user = new User();
$user->setEmail($associativerow['email']);
// ...

$this->csverror($user, $rowcount);

Теперь ограничение UniqueEntity проверяет уникальность пользователя по полю электронной почты.

person yceruto    schedule 24.08.2016
comment
Обновлен ответ с использованием ограничения в классе модели. - person yceruto; 24.08.2016