Aktualisierung funktioniert nicht: Problem nach dem Zurücksetzen des Doctrine Managers
P粉731861241
P粉731861241 2023-08-29 15:07:12
0
1
568
<p>Mit meinen Daten stimmt etwas nicht. Ich erhalte die Fehlermeldung <code>außerhalb des gültigen Bereichs</code> und versuche zu verhindern, dass <code>Close Entity Manager</code> funktionieren, da ich<code>reset manager</code> in Ausnahmefällen</p > <pre class="brush:php;toolbar:false;">public function renewDeliveryTime($delayReport) : void { versuchen { $this->delayReportRepository->updateRenewedDeliveryTimeAt($delayReport, 50000000); }catch (Ausnahme $Exception){ //Fehler außerhalb des Bereichs $this->managerRegistry->resetManager(); } } öffentliche Funktion updateRenewedDeliveryTimeAt($delayReport,$delayDuration) { /*** @var DelayReport $delayReport*/ $delayReport->setDelayDuration($delayDuration); $delayReport->setStatus(DelayReport::STATUS['DONE']); $this->getEntityManager()->flush(); }</pre> <p>Das Problem besteht darin, dass ich einen Fehler in meinen Daten erhalte, die Fehlermeldung <code>außerhalb des gültigen Bereichs für eine Ganzzahlspalte</code> erhalte und ich versuche zu verhindern, dass <p> code>Entitätsmanager geschlossen< /code>Weiterarbeiten und zu diesem Zweck in Ausnahmefällen <code>Manager zurücksetzen</code></p> <pre class="brush:php;toolbar:false;">public function enqueue($delayReport) : void { $this->pushInQueueReport($delayReport); $this->delayReportRepository->updateStatus($delayReport, DelayReport::STATUS['IN_QUEUE']); } öffentliche Funktion updateStatus($delayReport, $status) { /*** @var DelayReport $delayReport*/ $delayReport->setStatus($status); $this->getEntityManager()->flush(); }</pre> <p>Das Problem ist, dass, nachdem ich ein anderes Objekt und fast denselben Datenbankvorgang habe, es so aussieht, als ob <code>$this->getEntityManager()->flush()</code> Datenbank Es passiert nichts. Dies hat mit <code>$this->managerRegistry->resetManager()</code></p> zu tun. <p>Was ist die Lösung für dieses Problem? </p>
P粉731861241
P粉731861241

Antworte allen(1)
P粉143640496

问题在于resetManager(),并不是所有直接引用实体管理器的服务都会自动更新为新的实例。

updateStatus()方法中,您可以轻松地检查实体是否由实体管理器管理。

$uow = $this->getEntityManager()->getUnitOfWork();
if($uow->getEntityState($delayReport) !== UnitOfWork::STATE_MANAGED) {
    // not managed
}

不知道重新分配是否有助于此处,例如$this->getEntityManager()->merge($delayReport)

但是最好避免关闭管理器并在验证数据之前对其进行验证。

编辑:

未经测试,如果您将通过Registry获取重置的EntityManager。但是这值得一试。

$entityManager = $managerRegistry->getManagerForClass(get_class($delayReport));
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage