Создать слаг в 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. Но это не очень чисто.

Спасибо за любой привет или совет. Благодарю.

0 ответов

Другие вопросы по тегам