Heim  >  Fragen und Antworten  >  Hauptteil

Aktualisierung funktioniert nicht: Problem nach dem Zurücksetzen des Doctrine Managers

<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粉731861241P粉731861241440 Tage vor552

Antworte allen(1)Ich werde antworten

  • P粉143640496

    P粉1436404962023-08-30 13:15:44

    问题在于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));
    

    Antwort
    0
  • StornierenAntwort