Как изменить уникальный валидатор FOSUserBundle?

Я пытаюсь изменить способ, которым FOSUSerBundle проверяет имя пользователя/адрес электронной почты при регистрации пользователя, потому что мне нужно проверить, был ли пользователь ранее зарегистрирован, но отписался, через флаг состояния в объекте. Я думаю, что лучший способ - проверить, была ли электронная почта ранее в базе данных, за исключением тех, у кого флаг unsubscribed установлен в true, но как мне это сделать?

Итак, я вижу, как проверяется класс UniqueValidator, но я не понимаю, как это работает. Было бы здорово, если бы кто-нибудь объяснил это тоже.

Спасибо.


person Manu    schedule 30.03.2012    source источник


Ответы (1)


UniqueValidator вызывает метод validateUnique класса UserManager. Вы можете расширить класс и изменить функцию, чтобы проверить пользователя

$this->findUserByEmail($user->getEmail());

Изменить

Для второго вопроса вам нужно переопределить метод UpdateUser класса UserManager.

/**
 * Updates a user.
 *
 * @param UserInterface $user
 * @param Boolean $andFlush Whether to flush the changes (default true)
 */
public function updateUser(UserInterface $user, $andFlush = true)
{
    $existsUser = $this->findUserByEmail($user->getEmail()); 
    $this->updateCanonicalFields($user);
    $this->updatePassword($user);

    if($existsUser && null === $user->getId()){
        $user->setId($existsUser->getId());
        $this->em->merge($user);
    } else{
        $this->em->persist($user);
    }

    if ($andFlush) {
        $this->em->flush();
    }
}
person Mun Mun Das    schedule 30.03.2012
comment
Хорошо, но как мне приступить к расширению класса? Я создал собственный класс UserManager, но не знаю, как переопределить исходный класс FOS UserManager. Я сохранил его в свой пакет, связанный с исходным классом как use FOS\UserBundle\Entity\UserManger as BaseUserManager, но, похоже, он не работает. - person Manu; 02.04.2012
comment
Проверьте второе решение этой записи документа. - person Mun Mun Das; 02.04.2012
comment
кстати, конечно, я получаю ошибку SQLSTATE[23000]: Integrity constraint violation:... как я могу переопределить поле электронной почты, чтобы разрешить повторяющиеся записи? - person Manu; 02.04.2012
comment
неважно - уже задан вопрос - person Manu; 02.04.2012
comment
Спасибо, но я не вижу смысла переопределять таким образом функцию, которая обновляет пользователя. Почему это должно решить проблему с повторяющимися записями в сопоставлении сущностей с уникальными полями? Возможно, я не очень хорошо объяснил проблему... Мне нужно разрешить создавать повторяющиеся записи, т. е. когда пользователь отменяет подписку, а затем снова хочет подписаться, должно быть 2 записи с одним и тем же адресом электронной почты. ... Я знаю, это звучит странно, но это проблема с запросом клиента :( спасибо! - person Manu; 03.04.2012