在 Akeneo EventListener 中规范化对象

问题描述

我目前正在尝试在 Akeneo 事件侦听器中规范化对象(本场景中的产品)。 主要目标是能够在发生修改时将已编辑的完整产品作为事件发布到 RabbitMQ 队列中。

我目前正在努力进行规范化,我想获得一个“平面对象”,其中包含所有对象的字段和值,但进展并不顺利。

我首先在服务配置中设置了一个事件监听器: (services.yml)

parameters:
    pim_ce_dev_src_folder_location: '%kernel.project_dir%/vendor/akeneo/pim-community-dev'
services:
    my.listener:
        class: Acme\Bundle\AppBundle\EventListener\ProductModificationListener
        arguments:
            - '@swiftmailer.mailer'
            - '@logger'
            - '@pim_catalog.normalizer.standard.product'
        tags:
            - { name: kernel.event_listener,event: akeneo.storage.post_save,method: onPostSave }

并定义监听服务:

<?PHP

namespace Acme\Bundle\AppBundle\EventListener;

use Symfony\Component\Eventdispatcher\GenericEvent;
use Akeneo\Pim\Enrichment\Component\Product\Model\Product;
use Psr\Log\LoggerInterface;
use Akeneo\Pim\Enrichment\Component\Product\normalizer\Standard\Productnormalizer;

class ProductModificationListener
{
    private $mailer;
    private $logger;
    private $normalizer;

    public function __construct(\Swift_Mailer $mailer,LoggerInterface $logger,Productnormalizer $normalizer)
    {
        $this->normalizer = $normalizer;
        $this->mailer = $mailer;
        $this->logger = $logger;
    }

    public function onPostSave(GenericEvent $event)
    {
        $subject = $event->getSubject();

        if (!$subject instanceof Product) {
            // don't do anything if it's not a product
            return;
        }

        $this->logger->info($subject->getId());

        $normalizedobject = $this->normalizer->normalize($subject);
        $this->logger->info($normalizedobject);
    }
}

当我尝试标准化产品时(在产品版本之后),我收到此错误

[2021-01-27 15:54:54] app.INFO: 1207 [] []
[2021-01-27 15:54:54] app.INFO: 1207 [] []
[2021-01-27 15:54:54] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotnormalizableValueException: "Could not normalize object of type "Akeneo\Pim\Enrichment\Component\Product\Value\ScalarValue",no supporting normalizer found." at /srv/pim/vendor/symfony/serializer/Serializer.PHP line 178 {"exception":"[object] (Symfony\\Component\\Serializer\\Exception\\NotnormalizableValueException(code: 0): Could not normalize object of type \"Akeneo\\Pim\\Enrichment\\Component\\Product\\Value\\ScalarValue\",no supporting normalizer found. at /srv/pim/vendor/symfony/serializer/Serializer.PHP:178)"} []
[2021-01-27 15:54:54] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotnormalizableValueException: "Could not normalize object of type "Akeneo\Pim\Enrichment\Component\Product\Value\ScalarValue",no supporting normalizer found. at /srv/pim/vendor/symfony/serializer/Serializer.PHP:178)"} []

这是使用规范化的最佳方法吗?如果是,我该如何实现? (很确定我只是错过了一个论点或类似的东西)

非常感谢!

解决方法

所以,我找到了好的 Normalizer,它是“Akeneo\Pim\Enrichment\Component\Product\Normalizer\InternalApi\ProductNormalizer "

该代码正在运行:

parameters:
    pim_ce_dev_src_folder_location: '%kernel.project_dir%/vendor/akeneo/pim-community-dev'
services:
    my.listener:
        class: Acme\Bundle\AppBundle\EventListener\ProductModificationListener
        arguments:
            - '@swiftmailer.mailer'
            - '@logger'
            - '@pim_enrich.normalizer.product'
        tags:
            - { name: kernel.event_listener,event: akeneo.storage.post_save,method: onPostSave }
<?php

namespace Acme\Bundle\AppBundle\EventListener;

use Symfony\Component\EventDispatcher\GenericEvent;
use Akeneo\Pim\Enrichment\Component\Product\Model\Product;
use Psr\Log\LoggerInterface;
use Akeneo\Pim\Enrichment\Component\Product\Normalizer\InternalApi\ProductNormalizer;

class ProductModificationListener
{
    private $mailer;
    private $logger;
    private $normalizer;

    public function __construct(\Swift_Mailer $mailer,LoggerInterface $logger,ProductNormalizer $normalizer)
    {
        $this->normalizer = $normalizer;
        $this->mailer = $mailer;
        $this->logger = $logger;
    }

    public function onPostSave(GenericEvent $event)
    {
        $subject = $event->getSubject();

        if (!$subject instanceof Product) {
            // don't do anything if it's not a product
            return;
        }

        $this->logger->info($subject->getId());

        $normalizedObject = $this->normalizer->normalize($subject,'json');
        $json = json_encode($normalizedObject);
        $this->logger->info($json);
    }
}

这是输出:https://jsonblob.com/1bd43ac3-60e6-11eb-a1e4-25c2119d0903