<?php
namespace App\EventListener;
use App\EventListener\Handler\DataObject\AdvantageHandler;
use App\EventListener\Handler\DataObject\AwardHandler;
use App\EventListener\Handler\DataObject\BrandCategoryImageHandler;
use App\EventListener\Handler\DataObject\BrandHandler;
use App\EventListener\Handler\DataObject\CatalogGridBannerHandler;
use App\EventListener\Handler\DataObject\CatalogTopBannerHandler;
use App\EventListener\Handler\DataObject\CategoryHandler;
use App\EventListener\Handler\DataObject\CollectionCategoryImageHandler;
use App\EventListener\Handler\DataObject\CollectionHandler;
use App\EventListener\Handler\DataObject\FeatureHandler;
use App\EventListener\Handler\DataObject\GoodHandler;
use App\EventListener\Handler\DataObject\ProductHandler;
use App\EventListener\Handler\DataObject\ProductLabelHandler;
use App\EventListener\Handler\DataObject\ProductsSetHandler;
use App\EventListener\Handler\DataObject\ProductVariationHandler;
use App\EventListener\Handler\DataObject\VariationsConfigHandler;
use App\Service\Bus\Publisher\AdvantagePublisher;
use App\Service\Bus\Publisher\AwardPublisher;
use App\Service\Bus\Publisher\BrandCategoryImagePublisher;
use App\Service\Bus\Publisher\BrandPublisher;
use App\Service\Bus\Publisher\CatalogGridBannerPublisher;
use App\Service\Bus\Publisher\CatalogTopBannerPublisher;
use App\Service\Bus\Publisher\CollectionCategoryImagePublisher;
use App\Service\Bus\Publisher\CategoryPublisher;
use App\Service\Bus\Publisher\CollectionPublisher;
use App\Service\Bus\Publisher\FeaturePublisher;
use App\Service\Bus\Publisher\ProductPublisher;
use App\Service\Bus\Publisher\ProductLabelPublisher;
use App\Service\Bus\Publisher\ProductSetPublisher;
use App\Service\Bus\Publisher\ProductVariationPublisher;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\Advantage;
use Pimcore\Model\DataObject\Award;
use Pimcore\Model\DataObject\Brand;
use Pimcore\Model\DataObject\BrandCategoryImage;
use Pimcore\Model\DataObject\CatalogGridBanner;
use Pimcore\Model\DataObject\CatalogTopBanner;
use Pimcore\Model\DataObject\Category;
use Pimcore\Model\DataObject\CategoryBanner;
use Pimcore\Model\DataObject\Collection;
use Pimcore\Model\DataObject\CollectionCategoryImage;
use Pimcore\Model\DataObject\Feature;
use Pimcore\Model\DataObject\Good;
use Pimcore\Model\DataObject\Product;
use Pimcore\Model\DataObject\ProductLabel;
use Pimcore\Model\DataObject\ProductsSet;
use Pimcore\Model\DataObject\ProductVariation;
use Pimcore\Model\DataObject\VariationsConfig;
class DataObjectListener
{
/**
* @var array $publishers
*/
private array $publishers = [];
/**
* @param AwardPublisher $awardPublisher
* @param AdvantagePublisher $advantagePublisher
* @param FeaturePublisher $featurePublisher
* @param BrandPublisher $brandPublisher
* @param BrandCategoryImagePublisher $brandCategoryImagePublisher
* @param CollectionPublisher $collectionPublisher
* @param CollectionCategoryImagePublisher $collectionCategoryImagePublisher
* @param CategoryPublisher $categoryPublisher
* @param ProductPublisher $productPublisher
* @param ProductVariationPublisher $productVariationPublisher
* @param ProductSetPublisher $productSetPublisher
* @param ProductLabelPublisher $productLabelPublisher
* @param CatalogTopBannerPublisher $catalogTopBannerPublisher
* @param CatalogGridBannerPublisher $catalogGridBannerPublisher
*/
public function __construct(
AwardPublisher $awardPublisher,
AdvantagePublisher $advantagePublisher,
FeaturePublisher $featurePublisher,
BrandPublisher $brandPublisher,
BrandCategoryImagePublisher $brandCategoryImagePublisher,
CollectionPublisher $collectionPublisher,
CollectionCategoryImagePublisher $collectionCategoryImagePublisher,
CategoryPublisher $categoryPublisher,
ProductPublisher $productPublisher,
ProductVariationPublisher $productVariationPublisher,
ProductSetPublisher $productSetPublisher,
ProductLabelPublisher $productLabelPublisher,
CatalogTopBannerPublisher $catalogTopBannerPublisher,
CatalogGridBannerPublisher $catalogGridBannerPublisher,
)
{
$this->publishers['AWARD'] = $awardPublisher;
$this->publishers['ADVANTAGE'] = $advantagePublisher;
$this->publishers['FEATURE'] = $featurePublisher;
$this->publishers['BRAND'] = $brandPublisher;
$this->publishers['BRAND_CATEGORY_IMAGE'] = $brandCategoryImagePublisher;
$this->publishers['COLLECTION'] = $collectionPublisher;
$this->publishers['COLLECTION_CATEGORY_IMAGE'] = $collectionCategoryImagePublisher;
$this->publishers['CATEGORY'] = $categoryPublisher;
$this->publishers['PRODUCT'] = $productPublisher;
$this->publishers['PRODUCT_VARIATION'] = $productVariationPublisher;
$this->publishers['PRODUCTS_SET'] = $productSetPublisher;
$this->publishers['PRODUCT_LABEL'] = $productLabelPublisher;
$this->publishers['CATALOG_TOP_BANNER_PUBLISHER'] = $catalogTopBannerPublisher;
$this->publishers['CATALOG_GRID_BANNER_PUBLISHER'] = $catalogGridBannerPublisher;
}
/**
* @param DataObjectEvent $ev
* @return void
*/
public function onPostAdd(DataObjectEvent $ev): void
{
$this->process($ev, __FUNCTION__);
}
/**
* @param DataObjectEvent $ev
* @return void
*/
public function onPostUpdate(DataObjectEvent $ev): void
{
$this->process($ev, __FUNCTION__);
}
/**
* @param DataObjectEvent $ev
* @return void
* @throws \Throwable
*/
public function onPostDelete(DataObjectEvent $ev): void
{
$this->process($ev, __FUNCTION__);
}
/**
* @param DataObjectEvent $ev
* @return object
*/
private function getHandler(DataObjectEvent $ev): object
{
$constructorData = [$ev];
switch (get_class($ev->getObject())) {
case (Award::class): {
$constructorData[] = $this->publishers['AWARD'];
$handlerClassName = AwardHandler::class;
break;
}
case (Advantage::class): {
$constructorData[] = $this->publishers['ADVANTAGE'];
$handlerClassName = AdvantageHandler::class;
break;
}
case (Feature::class): {
$constructorData[] = $this->publishers['FEATURE'];
$handlerClassName = FeatureHandler::class;
break;
}
case (Brand::class): {
$constructorData[] = $this->publishers['BRAND'];
$handlerClassName = BrandHandler::class;
break;
}
case (BrandCategoryImage::class): {
$constructorData[] = $this->publishers['BRAND_CATEGORY_IMAGE'];
$handlerClassName = BrandCategoryImageHandler::class;
break;
}
case (Collection::class): {
$constructorData[] = $this->publishers['COLLECTION'];
$handlerClassName = CollectionHandler::class;
break;
}
case (CollectionCategoryImage::class): {
$constructorData[] = $this->publishers['COLLECTION_CATEGORY_IMAGE'];
$handlerClassName = CollectionCategoryImageHandler::class;
break;
}
case (Category::class): {
$constructorData[] = $this->publishers['CATEGORY'];
$handlerClassName = CategoryHandler::class;
break;
}
case (Good::class): {
$handlerClassName = GoodHandler::class;
break;
}
case (Product::class): {
$constructorData[] = $this->publishers['PRODUCT'];
$handlerClassName = ProductHandler::class;
break;
}
case (ProductVariation::class): {
$constructorData[] = $this->publishers['PRODUCT_VARIATION'];
$handlerClassName = ProductVariationHandler::class;
break;
}
case (VariationsConfig::class): {
$handlerClassName = VariationsConfigHandler::class;
break;
}
case (ProductLabel::class): {
$constructorData[] = $this->publishers['PRODUCT_LABEL'];
$handlerClassName = ProductLabelHandler::class;
break;
}
case (CatalogTopBanner::class): {
$constructorData[] = $this->publishers['CATALOG_TOP_BANNER_PUBLISHER'];
$handlerClassName = CatalogTopBannerHandler::class;
break;
}
case (CatalogGridBanner::class): {
$constructorData[] = $this->publishers['CATALOG_GRID_BANNER_PUBLISHER'];
$handlerClassName = CatalogGridBannerHandler::class;
break;
}
default: {
return new class {};
}
}
return new $handlerClassName(...$constructorData);
}
/**
* @param DataObjectEvent $ev
* @param string $methodName
* @return void
*/
private function process(DataObjectEvent $ev, string $methodName = ''): void
{
try {
$handler = $this->getHandler($ev);
if (method_exists($handler, $methodName)) $handler->{$methodName}();
} catch (\Throwable $e) {
throw $e;
}
}
}