问题描述
我目前正在尝试在 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