我的代码中有两个实体:会话和 SessionPicture 。
Session和SessionPicture之间存在OneToOne关系。 SessionPicture是映射实体,Session是反向实体。
会话有一个名为“Slug”的属性,该属性由StofDoctrineExtensionsBundle https://github.com/stof/StofDoctrineExtensionsBundle生成,并使用 Gedmo \ Sluggable 注释。
我有一个表单来创建一个Session(所以是SessionType),这个SessionType嵌入一个SessionPictureType 。 SessionPicture类包含一个文件属性(UploadedFile类),我使用 LifecycleEvents(PostPersist / PostUpdate)来上传SessionPicture的文件,并在我给它时提供相关Session的“slug”属性保存它。
我的问题是,当我尝试更改SessionPicture的另一个属性(让我们说“alt”)并且给它会话的“slug”的值时,我不能在PostPersist生命周期和然后将它保存到我的数据库中,因为此事件发生在onFlush之后,为时已晚。我必须在PrePersist Lifecyle中进行此操作。 但是我的会话的“slug”还没有,因为它是在扩展的onFlush期间生成的。
那么如何才能在prePersist生命周期中获得相关会话的重点?
(PS:我找到了一个解决方案,就是在我的控制器中保持会话,与Manager一起刷新,然后再次持续并重做flush(),但它不是很优雅)。
请在下面找到我的代码:
/ ** *会议 * * @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;
我的问题如下,我无法在会话冲洗之前得到slu ..
$this->alt = $this->getSession()->getSlug();
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
但是在这里,我可以获得slug,因为我的会话已经被刷新并且生成了slug
$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();
正如你所看到的,我必须坚持$ session并刷新一次,以便在flush时生成slug。然后再次持续,以便slug现在可用于prePersist n2的SessionPicture的“alt”属性,并再次刷新以保存alt属性。但它不是很干净。
感谢任何帮助或建议。感谢。