Akeneo 2.2.8:如何在akeneo.storage.pre_save事件中获取原始属性数据?

时间:2018-06-18 13:20:48

标签: symfony doctrine akeneo

我正在使用Akeneo 2.2.8而我正在尝试使用akeneo.storage.pre_save - 事件来比较原始产品数据和提供的新数据。我这样做是通过订阅akeneo.storage.pre_save - 事件:

event_subscribers.yml

parameters:
    vendor.bundle.event_subscriber.product_save.class: Vendor\Bundle\CustomBundle\EventSubscriber\ProductSaveSubscriber

services:
    vendor.bundle.event_subscriber.product_save:
        class: '%vendor.bundle.event_subscriber.product_save.class%'
        arguments:
            - '@pim_catalog.repository.product'
        tags:
            - { name: kernel.event_listener, event: akeneo.storage.pre_save, method: onPreSave, priority: 255 }

ProductSaveSubscriber.php

/**
 * @var ProductRepositoryInterface
 */
protected $productRepository;

public function __construct(ProductRepositoryInterface $productRepository)
{
    $this->productRepository = $productRepository;
}

public function onPreSave(GenericEvent $event)
{
    /** @var Product $subject */
    $subject = $event->getSubject();

    if ($subject instanceof Product) {

        $originalProduct = $this->productRepository->findOneByIdentifier($subject->getIdentifier());

        foreach ($subject->getAttributes() as $attribute) {
            if ($attribute->getReadOnly()) {
                echo "{$attribute->getCode()} : {$subject->getValue($attribute->getCode())}\n";
                echo "{$attribute->getCode()} : {$originalProduct->getValue($attribute->getCode())}\n";
            }
        }
    }
}

现在,当我运行此代码时,我希望第二个echo - 语句提供原始数据(因为我已经重新加载了这个)。但是,我从存储库加载的原始产品也有新数据。

此处需要注意的另一件事是,如果我添加die() - 语句,则数据不会存储在数据库中。因此,似乎存储库返回内存模型或类似的东西。

有人能指出我正确的方向吗?或者我使用错误的方法将新输入的数据与现有数据进行比较?

1 个答案:

答案 0 :(得分:2)

  

现在,当我运行此代码时,我希望第二个echo语句能够给出   原始数据(因为我重新加载了该数据)。但是,原来   我从存储库加载的产品也有新数据。

这可能是因为在工作原理中引用了该对象。因此,当您使用存储库获取您认为是原始对象的东西时,实际上可能与您更新的对象相同。

  

这里要注意的另一件事是,如果添加die()语句,   数据未存储在数据库中。因此,似乎仓库   返回内存模型或类似的模型。

这是因为由于您的订户正在侦听PRE_SAVE事件,所以尚未在数据库中刷新更新的产品。保存产品的方式如下:

  • 引发了PRE_SAVE事件
  • 提交/冲洗
  • 引发了POST_SAVE事件

因此,如果您在PRE_SAVE事件期间调用死,则不会调用COMMIT / FLUSH。

  

有人能指出我正确的方向吗?还是我用错了   比较新输入的数据和已经存在的数据的方法?

我不知道您的特定用例,但您可能想使用Query函数(请参见https://github.com/akeneo/pim-community-dev/blob/2.2/src/Pim/Bundle/CatalogBundle/Doctrine/ORM/Query/FindAttributesForFamily.php)。目的是直接在数据库中获取所需的数据(由于产品尚未在PRE_SAVE上的DB中刷新,因此它将是原始值)

我希望这会有所帮助。