Für ein riesiges Projekt mit vielen Entitäten habe ich eine gemeinsame Methode geschrieben: save()
.Zend Framework 2/Doctrine 2/Massenoperationen und Ereignisse triggern
Diese Methode wird in einem abstrakten Service gespeichert und wird im gesamten Projekt zum Speichern des Entitätsstatus verwendet.
Abstract :: save() sieht wie folgt aus:
public function save($entity)
{
$transactionStarted = $this->beginTransaction();
try
{
$action = $entity->getId() ? self::UPDATE : self::CREATION;
$this->getEventManager()->trigger('save.pre', $entity, ['action' => $action]);
$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush();
$this->getEventManager()->trigger('save.post', $entity, ['action' => $action]);
if ($transactionStarted)
{
$this->commitTransaction();
}
} catch (\Exception $e)
{
if ($transactionStarted)
{
$this->rollbackTransaction();
}
throw new Exception('Unable to save entity', $e);
}
return true;
}
public function beginTransaction()
{
if (!$this->getEntityManager()->getConnection()->isTransactionActive())
{
$this->getEntityManager()->getConnection()->beginTransaction();
return true;
}
return false;
}
public function commitTransaction()
{
$this->getEntityManager()->getConnection()->commit();
return $this;
}
public function rollbackTransaction()
{
$this->getEntityManager()->getConnection()->rollBack();
return $this;
}
In meinem Fall, wenn ein Mitglied (neu Member
Einheit) beim Aufruf des Member
Service (erweiterte AbstractService
) eingesetzt wird, wird eine E-Mail gesendet werden (zB) durch das Ereignis save.post
. Oder eine andere Aktion, die sich auf eine andere Methode zum Speichern von Diensten bezieht, kann ebenfalls fortgesetzt werden.
Beispiel des "Kind" Mitgliederservice :: save() -Methode
MemberService
public function save(Member $member)
{
// some stuff, e.g set a property
$member->setFirstName('John');
return parent::save($member);
}
Beispiel für getriggerte Ereignis
$sharedEventManager->attach(MemberService::class, 'save.post', [$this, 'onMembersCreation']);
public function onMembersCreation(EventInterface $event)
{
// send an email
// anything else ... update another entity ... (call AnotherService::save() too)
}
, die für einen einfachen Speichervorgang groß ist.
Aber jetzt möchte ich eine Menge Mitglieder massiv importieren, mit Kreationen, Updates, ... Und um das zu erreichen, lese ich das Doctrine-Dokument zu Bulk-Importen. Doc here
Aber wie meinen Code richtig zu aktualisieren, um "Massenspeicherung" und "Einzelspeicherung" zu behandeln? Und behalten Sie Transaktionssicherheit und Ereignisse?
Was sind "viele Mitglieder"? 1k? 1M? Ihre Antwort wird definieren, welche Strategie Sie adaopt – JesusTheHun
Hallo JesusTheHun, ich danke Ihnen, die erste, die von meinem Problem interessiert sein :) "eine Menge Mitglieder" ist von 4k bis 10k – ceadreak
Ist dies ein One-Shot-Import oder muss es oft laufen? Zugrunde liegende Frage ist: Ist Leistung wichtig? – JesusTheHun