使用StofDoctrineExtensionsBundle在Symfony2的Prepersist生命周期中生成Slug

时间:2015-09-03 07:51:40

标签: symfony doctrine-orm lifecycle slug

我的代码中有两个实体:会话 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属性。但它不是很干净。

感谢任何帮助或建议。感谢。

0 个答案:

没有答案