Введение
Раньше у меня была почти аналогичная проблема, и я смог решить ее, используя Обратные вызовы жизненного цикла . Поскольку я не очень разбираюсь в Symfony, я сначала объясню свою проблему и свое решение, а затем справлюсь с вашей в этом ответе.
Моя проблема
У меня был объект NewsletterItem
, и мне нужно было создать для него hash
, который зависел от id
, поэтому мне нужно было установить значение hash
после создания записи. Я знаю, что вам нужно будет что-то исполнить до того, как будет создана запись, но потерпите меня несколько минут, я думаю, что это будет хорошо проведенное время с вашей стороны, так как я был бы счастлив увидеть некоторый предыдущий опыт, когда я был в вашей ситуации, с почти аналогичной проблемой.
Мое решение
Я использовал Doctrine\ORM\Mapping as ORM
:
use Doctrine\ORM\Mapping as ORM;
Я указал, что у объекта есть обратные вызовы жизненного цикла:
/**
* ...
* @ORM\HasLifecycleCallbacks
*/
class NewsletterItem implements \Serializable
{
Я убедился, что у меня есть метод, который инициализирует hash
:
private function calculateHash()
{
//Here I set the hash based on id, among others and return it
}
- Я реализовал
setHash
и убедился, что он будет вызван после создания сущности:
/**
* Set hash
*
* @ORM\PostPersist
* @return NewsletterItem
*/
public function setHash()
{
$this->calculateHash();
return $this;
}
- Я очистил кеш приложения
и тогда все заработало как шарм
Ваше решение
/**
* @ORM\Entity()
* @ORM\Table(name="user_data")App\Models
* @ORM\HasLifecycleCallbacks
*/
class UserData{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $email;
/**
* @ORM\Column(type="string", length=255, options={"default":""})
*/
protected $telephone = '';
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* @return mixed
*/
public function getTelephone()
{
return $this->telephone;
}
/**
* @ORM\PrePersist
* @param mixed $telephone
*/
public function setTelephone($telephone)
{
$this->telephone = ($telephone ? $telephone : '');
}
}
Я никогда не пробовал то, что предлагаю вам, поэтому, если оно не работает, вам может понадобиться метод initializeTelephone
специально для этой цели.