我有一个实体根据数字ID创建哈希,并使用 PostPersist 生命周期钩子创建盐。
我已验证正在触发setHash
方法并指定正确的字符串(通过日志记录),但db中的hash
列为空。
什么可能阻止价值储蓄?
/**
* Deployment
*
* @ORM\Table(name="deployments")
* @ORM\Entity(repositoryClass="AppBundle\Repository\DeploymentRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Deployment
/**
* @var int
*
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=16, nullable=true)
*/
protected $hash;
...
/**
* @ORM\PostPersist
*/
public function setHash()
{
$hashids = new Hashids($this->hashSalt, 5, 'abcdefghijkmnopqrstuvwxyz');
$this->hash = $hashids->encode($this->getId());
}
...
}
答案 0 :(得分:0)
postUpdate、postRemove、postPersist 这三个 post 事件在 EntityManager#flush() 中调用。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非持久性项目,例如非映射字段、日志记录甚至是未由 Doctrine 直接映射的关联类。
意味着您对实体的更改不会在 perist() 和 flush() 之间保存
如果你真的需要一个事件你可以做什么,你可以尝试一个 postFlushEvent,在那里你检查哈希是否为空,如果是,设置它并再次刷新,但要注意无限循环(确保你只重新刷新如果哈希为空)。
但是每次您的 entityManager 刷新时都会触发该事件,以进行更新。我的建议是,如果您只保留代码的一处,只需手动执行即可。如果有几个地方可以持久化实体,就去事件。