Eventi
Qui sono definiti gli eventi lanciati da DataObject, Asset e Documents e altri eventi di flussi interni ad SOH.
DataObject
La gestione degli eventi sui DataObject è gestito tramite il nostro Event Manager per semplificare la scrittura dei Listener di eventi.
Listener su DataObject
La configurazione principale che ascolta tutti i dataobject è la seguente:
class ProductListener extends AbstractDataObjectEventListener
{
public function config(): EventListeningConfig
{
return $this->initConfig(Product::class);
}
}
Listener su DataObject e Path
La configurazione principale specificando il path di ascolto è la seguente:
class ProductListener extends AbstractDataObjectEventListener
{
public function config(): EventListeningConfig
{
return $this->initConfig(Product::class, "/Products/");
}
}
Registrazione servizio
E' possibile registrare l'intera cartella che contiene gli event listener con il tag specifico in questo modo:
App\EventListener\:
resource: '../src/EventListener'
public: true
tags: [ 'EventListening' ]
Best Practice
1. NON salvare oggetti DataObject in preAdd o preUpdate
Lo scopo dei metodi preAdd e preUpdate è preparare i dati, le informazioni o lanciare eccezioni per l’operazione di salvataggio.
Salvare oggetti diversi durante questi metodi può causare:
- loop infiniti di salvataggio
- perdita di dati
- codice difficile da debuggare
Esempio di come evitare il salvataggio di oggetti esterni o collegati nei metodi preUpdate e preAdd
Utilizzare il servizio EventOperationsService che raccoglie le informazioni nel pre per poi eseguirlo durante il post.
Di seguito un esempio completo:
<?php
namespace App;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\Product;
use Sintra\CoreBundle\AbstractClass\AbstractDataObjectEventListener;
use Sintra\CoreBundle\Config\EventListeningConfig;
use Sintra\CoreBundle\Service\Events\EventOperationsService;
class ProductListener extends AbstractDataObjectEventListener
{
public function __construct(protected EventOperationsService $eventOperationsService)
{
}
public function config(): EventListeningConfig
{
return $this->initConfig(Product::class);
}
public function onPreUpdate(DataObjectEvent $event): void
{
$this->eventOperationsService->addFunction(function () {
// Call your method you want to execute in the post update
}, static::class);
}
public function onPostUpdate(DataObjectEvent $event): void
{
$this->eventOperationsService->execute(static::class);
}
}
2. NON salvare informazioni degli oggetti come variabili nei Listener
Abbiamo effettuato dei test e abbiamo riscontrato che gli oggetti Listener non hanno necessariamente uno scope per singola operazione. Lo stesso Listener può essere riutilizzato per diversi DataObject, il che può generare numerosi problemi complessi, come:
- condivisione indesiderata di stato
- comportamenti non prevedibili
- difficoltà di debug
N.B.: Evita quindi di memorizzare dati dell’oggetto trattato direttamente come proprietà della classe Listener.
3. Listener interessati da questa gestione
Questa orchestrazione dell’EventManager riguarda esclusivamente i Listener che estendono le seguenti classi astratte:
AbstractAssetEventListenerAbstractDataObjectEventListenerAbstractDocumentEventListener
Flussi SOH
Eventi lanciati durante i flussi standard SOH.
Di seguito un esempio di classe, registrata come servizio, che ascolta gli eventi in base al tag inserito.
<?php
namespace App\EventListener;
use Sintra\SyncBundle\Event\FlowlyzeProductMappedEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
class SohListener
{
public function __construct()
{
}
#[AsEventListener(event: FlowlyzeProductMappedEvent::POST_MAP)]
public function onPostMapFlowlyzeProduct(FlowlyzeProductMappedEvent $event): void
{
// Do your logic here
}
}
Eventi Core
PostMigration DataObject ≥ 3.5
- Tag evento:
soh.core.postMigrationDataObject - Tag tipizzato evento:
Sintra\CoreBundle\Event\MigrationDataObjectEvent::POST_MIGRATE - Classe evento:
Sintra\CoreBundle\Event\MigrationDataObjectEvent
Gli altri eventi supporti sono presenti ai seguenti link: