Passa al contenuto principale

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:

  • AbstractAssetEventListener
  • AbstractDataObjectEventListener
  • AbstractDocumentEventListener

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: