Создать слаг в Prepersist Lifecycle для Symfony2 с помощью StofDoctrineExtensionsBundle
У меня есть два объекта в моем коде: Session и SessionPicture.
Существует связь OneToOne между Session и SessionPicture. SessionPicture - это объект сопоставления, а Session - обратный.
У сеанса есть атрибут с именем "Slug", который генерируется благодаря StofDoctrineExtensionsBundle https://github.com/stof/StofDoctrineExtensionsBundle и с использованием аннотации Gedmo\Sluggable.
У меня есть форма для создания Session (так SessionType), и этот SessionType встраивает SessionPictureType. Класс SessionPicture содержит атрибут файла (класс UploadedFile), и я использовал LifecycleEvents (PostPersist/PostUpdate), чтобы загрузить файл SessionPicture и присвоить ему свойство "slug" соответствующего сеанса, когда я его сохраняю.
Моя проблема в том, что когда я пытаюсь изменить другое свойство моего SessionPicture (скажем, "alt") и присвоить ему значение "слаг" сеанса, я не могу сделать это в жизненном цикле PostPersist и затем сохранить его в своей базе данных потому что это событие происходит после onFlush, что слишком поздно. Я должен сделать это в PrePersist Lifecyle. Но тогда "слаг" моего сеанса пока недоступен, потому что он генерируется расширением во время onFlush.
Итак, как я могу получить слаг из соответствующего сеанса в prePersist lifecyle?
(PS: я нашел решение, которое состоит в том, чтобы сохранить сеанс в моем контроллере, выполнить сброс с помощью диспетчера, а затем снова сохранить и повторить сброс (), но это не очень элегантно).
Пожалуйста, найдите мой код ниже:
/ ** * Session * * @ORM \ Table () * @ORM \ Entity (repositoryClass = "MyBundle \ Entity \ SessionRepository") * @ORM \ HasLifecycleCallbacks () * /
class Session
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @ORM\OneToOne(targetEntity="MyBundle\Entity\SessionPicture", cascade={"persist", "remove"}, mappedBy="session")
* @ORM\JoinColumn(name="session_picture_id", referencedColumnName="id", nullable=true)
*/
private $sessionPicture;
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set sessionPicture
*
* @param \MyBundle\Entity\SessionPicture $sessionPicture
*
* @return Session
*/
public function setSessionPicture(MyBundle\Entity\SessionPicture $sessionPicture = null)
{
$this->sessionPicture = $sessionPicture;
return $this;
}
/**
* Get sessionPicture
*
* @return \MyBundle\Session\SessionPicture
*/
public function getSessionPicture()
{
return $this->sessionPicture;
}
И мой код SessionPicture:
/**
* @var string
*
* @ORM\Column(name="alt", type="string", length=255, nullable=true)
*/
private $alt;
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255, nullable=true)
*/
private $path;
/**
* @ORM\OneToOne(targetEntity="MyBundle\Entity\Session", inversedBy="sessionPicture")
*/
private $session;
public $file;
private $fileNameForRemove;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set extension
*
* @param string $extension
*
* @return SessionPicture
*/
public function setExtension($extension)
{
$this->extension = $extension;
return $this;
}
/**
* Get extension
*
* @return string
*/
public function getExtension()
{
return $this->extension;
}
/**
* Set alt
*
* @param string $alt
*
* @return SessionPicture
*/
public function setAlt($alt)
{
$this->alt = $alt;
return $this;
}
/**
* Get alt
*
* @return string
*/
public function getAlt()
{
return $this->alt;
}
/**
* Set path
*
* @param string $path
*
* @return SessionPicture
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* Set session
*
* @param \MyBundle\Entity\Session $session
*
* @return SessionPicture
*/
public function setSession(\NyBundle\Entity\Session $session = null)
{
$this->session = $session;
return $this;
}
/**
* Get session
*
* @return \MyBundle\Entity\Session
*/
public function getSession()
{
return $this->session;
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpload()
{
if($this->file === null)
return ;
$extension = $this->file->guessExtension();
$this->extension = (string)$extension;
Моя проблема ниже, я не могу получить пулю до завершения сессии
$this->alt = $this->getSession()->getSlug();
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
Но здесь я могу получить пулю, потому что мой сеанс уже сброшен и порция сгенерирована
$this->alt = $this->getSession()->getSlug();
$this->path = $this->alt.'.'.$this->extension;
if ($this->file === null)
return ;
$this->file->move($this->getUploadRootDir(), $this->path);
unset($this->file);
}
Наконец, вот выдержка из кода моего контроллера:
$form->handlerequest($request);
$validator = $this->get('validator');
$errorList = $validator->validate($session);
if (count($errorList) == 0)
{
$em = $this->getDoctrine()->getManager();
$em->persist($session);
$em->flush();
$em->persist($session);
$em->flush();
Как вы можете видеть, мне пришлось сохранить сеанс $ и сбросить его один раз, чтобы сгусток генерировался при сбросе. Затем сохранитесь снова, чтобы слаг теперь был доступен для свойства "alt" SessionPicture в prePersist n2, и снова выполните сброс, чтобы сохранить свойство alt. Но это не очень чисто.
Спасибо за любой привет или совет. Благодарю.