Для огромного проекта с большим количеством объектов я написал общий метод save()
.Zend framework 2/Doctrine 2/Выполнение массовых операций и событий
Этот метод хранится в абстрактной службе и используется во всем проекте для сохранения состояния объектов.
AbstractService :: сохранить() выглядит следующим образом:
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;
}
В моем случае, когда элемент вставлен (новый Member
объект) при вызове Member
службы (расширенный AbstractService
), отправляется сообщение электронной почты (например) через событие save.post
. Или может быть выполнено другое действие, связанное с другим методом вызова службы.
Пример "ребенок" MemberService :: сохранить() метод
MemberService
public function save(Member $member)
{
// some stuff, e.g set a property
$member->setFirstName('John');
return parent::save($member);
}
Пример сработавшего события
$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)
}
Это отлично подходит для простого процесса сохранения.
Но теперь я хочу массово импортировать множество членов, с творениями, обновлениями ... И для этого я прочитал документ Доктрины, связанный с массовым импортом. Doc here
Но как правильно обновить код, чтобы обрабатывать «объемную экономию» и «единую экономию»? И сохранить безопасность транзакций и события?
Что такое "много членов"? 1k? 1М? Ваш ответ определит, какую стратегию вы должны adaopt – JesusTheHun
Привет, JesusTheHun, спасибо, что вы первый, кого интересует моя проблема :) «много членов» от 4k до 10k – ceadreak
Является ли это одним выстрелом или он должен часто? Основной вопрос: имеет ли значение производительность? – JesusTheHun