我现在在以下
中被困了一天我在我的帐户实体上创建了一个监听器,它会监听prePersist
,preUpdate
,postPersist
和postUpdate
。我认为postUpdate
是在数据存储到数据库后执行的,但现在我对此表示怀疑。
听众
/**
* Account listener
*/
class AccountListener
{
private $container;
/**
* Constructor
*
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
/**
* Pre persist
*
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Accounts) {
$this->checkIfApiCallIsNeeded($entity, $args);
}
}
/**
* pre update
*
* @param LifecycleEventArgs $args
*/
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Accounts) {
$this->checkIfApiCallIsNeeded($entity, $args);
}
}
/**
* Post persist
*
* @param LifecycleEventArgs $args
*/
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Accounts) {
$this->callApi($entity, $args);
}
}
/**
* Post update
*
* @param LifecycleEventArgs $args
*/
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Accounts) {
$this->callApi($entity, $args);
}
}
/**
* Checks if a update should be send to the api and store the result in db
*
* @param Accounts $account
* @param LifecycleEventArgs $args
*/
private function checkIfApiCallIsNeeded(Accounts $account, LifecycleEventArgs $args)
{
$importantProperties = array(
'contactName',
'address',
'zipPostal',
'city',
'stateProvince',
'country'
);
$callApi = 0;
$uow = $args->getEntityManager()->getUnitOfWork();
$changeset = $uow->getEntityChangeSet($account);
/**
* Check if one of the important properties has been changed
*/
foreach ($importantProperties as $property) {
if (array_key_exists($property, $changeset)) {
$callApi = 1;
}
}
/**
* Store in database
*/
$account->setNeedUpdate($callApi);
}
/**
* Update account to api
*
* @param Accounts $account
*/
private function callApi(Accounts $account, LifecycleEventArgs $args)
{
$callApi = $account->getNeedUpdate();
$accountId = $account->getId();
if ($callApi === 1) {
// Call the API
}
}
}
监听器应检查其中一个重要字段是否已更改,如果是,则应发送API请求(在帐户更新后)。但是,当我更新我的帐户时,看起来我的API中的操作仍然是旧帐户。
然后我在die(var_dump($account));
函数内尝试callApi
。结果是变量$account
给了我更新的结果
实体就像我预期的那样。函数callApi()
内的但尚未将数据存储到数据库中! (我知道这是因为die(var_dump($account));
的值与数据库中的值不相等)。因此,在这种情况下,我的API仍然可以从数据库中获取旧帐户。
我不知道为什么会发生这种情况,但对我而言,postUpdate
函数完全执行后,数据会被存储。
我想知道为什么会发生这种情况,如果这是正常行为。我还想知道如何在数据存储到数据库后确保调用API。
答案 0 :(得分:2)
postUpdate
事件不会在flush()
之后调用,而是在同花顺内部调用。这就是postFlush
事件存在的原因(即使它不是生命周期回调)。