Если вы хотите сохранить оригинал, вам нужно найти способ убедиться, что уникальное поле не использовалось ранее. Я думаю, что самый простой способ сделать это — использовать настраиваемый репозиторий для вашего пользовательского поля и отключить фильтр softdeleteable перед поиском.
По умолчанию UniqueEntity использует findBy и репозиторий, установленный для класса, но имеет смысл создать собственный метод с отключенным фильтром по умолчанию, чтобы не возиться с ограничением, оставив обычный метод нетронутым.
Поскольку вы используете FOSUserBundle (по крайней мере, так кажется из названия таблицы fos_user
), вы можете установить репозиторий Class в вашем сопоставлении (XML — это большая куча беспорядка, но вы можете видеть это здесь)...
// Annotation
@ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
//YAML
Acme\UserBundle\Entity\User:
type: entity
repositoryClass: Acme\UserBundle\Entity\UserRepository
А затем в вашем UserRepository
просто добавьте метод findIncludingSoftdeletedBy
, отключающий фильтр softdeleteable, например...
namespace Acme\UserBundle\Entity;
use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository
{
/**
* Finds users by a set of criteria including sofdeleted.
*
* @param array $criteria
* @param array|null $orderBy
* @param int|null $limit
* @param int|null $offset
*
* @return array The objects.
*/
public function findIncludingSoftdeletedBy(
array $criteria, array $orderBy = null, $limit = null, $offset = null
)
{
// Get array of enabled filters
$enabledFilters = $this->em->getFilters()->getEnabledFilters();
// If softdeleteable (or soft-deleteable depending on config)
// is in array of enabled filters disable it
if (array_key_exists('softdeleteable', $endabledFilters)) {
// disabled softdeleteable filter ($this->em being entity manager)
$this->_em->getFilters()->disable('softdeleteable');
}
// return regular "findBy" including softdeleted users
return $this->findBy($criteria, $orderBy, $limit, $offset);
}
}
Обновить
Я забыл этот бит.
Затем вам нужно будет создать свой собственный файл проверки, который будет ссылаться на это новое ограничение проверки. (Для FOSUserBundle и в YAML (я предпочитаю YAML, XML выглядит так, будто на моем экране заболела книга по физике)).
Acme\UserBundle\Entity\User:
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: usernameCanonical
errorPath: username
message: fos_user.username.already_used
// Your method instead of the default "findBy"
method: findIncludingSoftdeletedBy
groups: [ Registration, Profile ]
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: emailCanonical
errorPath: email
message: fos_user.email.already_used
// Your method instead of the default "findBy"
method: findIncludingSoftdeletedBy
groups: [ Registration, Profile ]
Дополнительную информацию об ограничении UniqueEntity см. в документах, в частности..
поля
тип: массив | строка [опция по умолчанию]
Этот обязательный параметр представляет собой поле (или список полей), в котором этот объект должен быть уникальным. Например, если вы указали как поле электронной почты, так и поле имени в одном ограничении UniqueEntity, то это обеспечит уникальность значения комбинации (например, у двух пользователей может быть один и тот же адрес электронной почты, если у них нет одного и того же имени). ).
Если вам нужно, чтобы два поля были уникальными по отдельности (например, уникальный адрес электронной почты и уникальное имя пользователя), используйте две записи UniqueEntity, каждая с одним полем.
person
qooplmao
schedule
17.09.2014