Я немного сбит с толку, где мне реализовать подписчика на события (на самом деле, я даже не уверен, должен ли я вместо этого использовать Entity Listener).
Итак, у меня есть эта сущность с именем ServiceDoctrineEntity
и у этой сущности есть много устройств хранения:
class ServiceDoctrineEntity {
/**
* One Service has many storage devices.
*
* @OneToMany(targetEntity="ServiceStorageDevicesDoctrineEntity", mappedBy="service", cascade={"all"})
* @OrderBy({"order" = "ASC"})
* @var ServiceStorageDevicesDoctrineEntity $storage_devices Description.
*/
private $storage_devices;
}
И каждое устройство хранения имеет свое собственное «пространство / значение хранения»
class ServiceStorageDevicesDoctrineEntity {
/**
* @Column(type="bigint", nullable=true, options={"comment":"The normalised value, calculated from $amount * $unit."})
* @var int $value The normalised value, calculated from $amount * $unit.
*/
private $value;
}
Моя проблема в том, что я должен запустить логику вычислений, котораябудет срабатывать каждый раз, когда происходит изменение в устройствах хранения (новое устройство хранения добавлено / удалено, или место хранения изменено и т. д.).
- Мне нужно вычислить общее количество «устройств хранения» этой службыиметь.
- Суммировать или суммировать итоговые "значения" каждого из устройств хранения
Эти "сводные данные" будут сохранены на объекте с именем: ServiceStorageSummaryDoctrineEntity
class ServiceStorageSummaryDoctrineEntity {
/**
* One Service Support type has One Service.
*
* @OneToOne(targetEntity="ServiceDoctrineEntity", inversedBy="storage_summary")
* @JoinColumn(name="service_id", referencedColumnName="id")
*/
private $service;
/**
* @Column(type="bigint", nullable=true, options={"default":0, "comment":"The total value (normalised) of storage space."})
* @var integer $total_value The total value (normalised) of storage space.
*/
private $total_value;
/**
* @Column(type="integer", nullable=true, options={"default":0, "comment":"The total amount of storage devices."})
* @var integer $device_count The total amount of storage devices.
*/
private $device_count;
}
Я пытался написать класс EventSubscriber
для этого, который прослушивает onFlush
событие:
class ServiceStorageDevicesEventListener implements EventSubscriber {
/**
* Returns an array of events this subscriber wants to listen to.
*
* @return string[]
*/
public function getSubscribedEvents() {
return array(
Events::onFlush,
);
}
public function onFlush( OnFlushEventArgs $eventArgs ) {
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ( $uow->getScheduledEntityInsertions() as $entity ) {
// Should I run the computation here?
// Which entity should I be listening to? `ServiceDoctrineEntity` or `ServiceStorageSummaryDoctrineEntity`?
}
foreach ( $uow->getScheduledEntityUpdates() as $entity ) {
// Should I run the computation here?
// Which entity should I be listening to? `ServiceDoctrineEntity` or `ServiceStorageSummaryDoctrineEntity`?
}
foreach ( $uow->getScheduledEntityDeletions() as $entity ) {
// Should I run the computation here?
// Which entity should I be listening to? `ServiceDoctrineEntity` or `ServiceStorageSummaryDoctrineEntity`?
}
}
}
Но я не уверен, как поступить в этом:
- Прав ли я при использовании подписчика на событие?
- Am Правильно ли я слушать
onFlush
событие Какой объект должен быть указан в списке:
(a) ServiceDoctrine
объект и проходить через каждое устройство хранения?
(b) или ServiceStorageDevicesDoctrineEntity
, но разве это не означает, что логика вычислений будет выполняться для каждого изменения запоминающего устройства?