Как обобщить сопоставление сущности Symfony, которая потенциально связана со многими типами сущностей - PullRequest
0 голосов
/ 21 сентября 2018

В предыдущем вопросе я хотел знать, как запретить пользователю редактировать форму, если другой пользователь уже использовал ее.Поскольку я использую SF 2.8, я не могу использовать компонент блокировки (> SF3.4), поэтому я подумал сделать это вручную, с сущностью, управляющей замками.

для моей сущности мне нужно:

  • user_id (пользователь, который редактирует форму, создает блокировку)
  • entity_id (идентификатор отредактированной сущности)
  • entity_class (FQCN для entityType)
  • createAt (дата блокировки)

более того, мне нужно ограничение UniqueEntity для (user_id, entity_id и entity_class)

Вот где у меня проблема с отображением: сущность (id) может быть разного типа (у меня есть Профессия, Модуль, Учреждение, Пользователь ...)

Итак, с точки зрения доктрины, я нене понимаю, как я могу это сделать.

может быть, я смогу использовать идентификатор сущности, но потерять саму силу связей docrine / symfony.

/**
 * Lockit.
 *
 * @ORM\Table(name="lockit")
 * 
 * @UniqueEntity(
 *     fields={"entityClass", "entityId", "user"}
 * )
 */
class Lockit
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
  private $id;

  /**
   * FQCN of the entity associated with the form to be locked.
   *
   * @var string
   * @ORM\Column(name="entity_class", type="string")
   */
  private $entityClass;

  /**
   * Entity id associated with the form to be locked.
   * @ORM\Column(name="entity_id", type="integer")
   */
  private $entityId;

  /**
   * @var \Simusante\SimustoryBundle\Entity\User
   *
   * @ORM\ManyToOne(targetEntity="Simusante\SimustoryUserBundle\Entity\User")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="userId", referencedColumnName="id", nullable=true)
   * })
   */
  private $user;

  /**
   * Date of the lock creation.
   *
   * @var \DateTime
   * @ORM\Column(name="createdAt", type="datetime", nullable=true)
   * @Assert\Date()
   */
  private $createdAt;

Другим решением было бы создать какмного lockEntities, как я могу заблокировать сущность с. Я бы создал базовый замок, а затем ProfessionLock,InstitutionLock ... где я мог бы использовать «правильное» отображение.

  /**
   * @ORM\ManyToOne(targetEntity="Institution")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="institutionId", referencedColumnName="id", nullable=true)
   * })
   */
  private $user;

это будет работать, но это не так «оптимизировано», как могло бы.

возможно, есть другоепуть к этому, где мне не нужно создавать столько объектов, сколько у меня есть тип формы для блокировки.

Заранее спасибо

1 Ответ

0 голосов
/ 22 сентября 2018

Здесь у меня проблема с отображением: сущность (id) может быть другого типа (у меня есть Профессия, Модуль, Учреждение, Пользователь ...)

КакЯ вижу, что только сопоставление поля entityId как текстового поля вместо целого числа должно решить вашу проблему.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...