Я использую DoctrineExtensions в моем проекте Symfony 2, у меня есть простой класс Entity, где я использую Sluggable для свойства, тогда я хотел бы установить значение на другое свойство на slug, но даже при использовании Lifecycle Callbacks
@ORM\PrePersist
, @ORM\PreFlush
, в это время свойство slug все еще пустое, что означает, что slug еще не создан, вот мой класс, чтобы сохранить это короткое, я не собираюсь ставить здесь get and set
функция каждого свойства, просто часть класса, которые являются важными для данного примера (пожалуйста, прочитайте комментарии)Обновление другого поля при создании пула с помощью DoctrineExtensios
<?php
namespace My\LearnBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* Banner
*
* @ORM\Table(name="banner")
* @ORM\HasLifecycleCallbacks()
*/
class Banner {
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=128, nullable=false)
* @Assert\NotBlank()
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=256, nullable=false)
* @Gedmo\Slug(fields={"name"})
*/
private $slug;
/**
* @var string
*
* @ORM\Column(name="tracking_url", type="string", length=256, nullable=false)
*/
private $trackingUrl;
/**
* Set slug
*
* @param string $slug
* @return Banner
*/
public function setSlug($slug) {
$this->slug = $slug;
$this->trackingUrl = $slug."/tracking"; //Doesn't work
return $this;
}
/**
* Set trackingUrl value
*
* @ORM\PreUpdate
*/
public function setTrackingUrlValue() {
//the slug is empty. Doesn't work
$this->trackingUrl = $this->slug."/tracking";
return $this;
}
/**
* Set trackingUrl value
*
* @ORM\PreFlush
*/
public function setTrackingUrlValueOnFlush() {
//the slug is empty. Doesn't work
return $this->setTrackingUrlValue();
}
}
что я пытался? ну, используя функцию setSlug
, но она не работает (обратите внимание на комментарии выше), кажется, что она не вызывается. Использование Lifecycle Callbacks
@ORM\PrePersist
, @ORM\PreFlush
и @ORM\PreUpdate
, не работает ни.
Теперь я решил это в контроллере, вызвав flush
на EntityManager
, снова установив значение свойства на основе пули и вызывая flush
, поэтому, делая 2 запроса базы данных в одном запросе, один для вставки, один для обновления. Я не хочу использовать Event Listener
, потому что это поведение просто для этого конкретного объекта или существует способ привязать прослушиватель событий к одному объекту ?.
Но сейчас я хотел бы знать:
почему то, что я пытался сделать, используя работу Lifecycle Callbacks
Ждут»?
Почему использование функции setSlug
не работает?
Чистый способ выполнить то, что я хочу?
благодаря
Есть ли существенные причины для сохранения URL отслеживания? Если нет, вы могли бы просто «getTrackingUrl» строить URL каждый раз вместо этого. – gilden
Хорошая идея, то же самое натолкнуло на мой взгляд, но меня попросили перенести отслеживаниеUrl в базу данных –