FOSElasticaBundle and FPNTagBudle index tags



我正在使用FPNTagBudle来标记我的文档,FOSElasticaBundle将它们索引到elasticsearch index中。

使用FPNTagBudle将标签加载到对象中,您需要使用loadTagging如下方法:

$tagManager = $this->get('fpn_tag.tag_manager');
$tagManager->loadTagging($object);

从表单编辑对象时,我加载了标签,因此一切正常,并且当对象保存索引时,索引会正确构建。问题是当我运行fos:elastica:populate命令来填充所有对象时,标记被跳过,因为那时没有加载标记。

我试图挂接到PRE_TRANSFORM事件并在那里加载Taging,但随后它弄乱了表单,因为从表单添加的新标签通过第二次调用loadTagging擦除。

是否可以在钩子PRE_TRANSFORM识别这是填充命令,以便我只能加载标记?或者也许我的问题更根本?

我决定使用PRE_TRANSFORM事件并区分它是来自表单还是用php_sapi_name()填充命令。以下整个解决方案:

订户

<?php
namespace AppBundleEventSubscriber;
use FOSElasticaBundleEventTransformEvent;
use FPNTagBundleEntityTagManager;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
/**
 * Class ElasticaTransformSubscriber
 * @package AppBundleEventSubscriber
 */
class ElasticaTransformSubscriber implements EventSubscriberInterface
{
    /** @var TagManager */
    private $tagManager;
    /**
     * ElasticaTransformSubscriber constructor.
     * @param $tagManager
     */
    public function __construct(TagManager $tagManager)
    {
        $this->tagManager = $tagManager;
    }
    /**
     * @param TransformEvent $event
     */
    public function preTransformOperations(TransformEvent $event)
    {
        if (php_sapi_name() === 'cli') {
            $object = $event->getObject();
            $this->tagManager->loadTagging($object);
        }
    }
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return array(
            TransformEvent::PRE_TRANSFORM => 'preTransformOperations',
        );
    }
}

服务

app.subscriber.object_transformer_elastica:
    class: AppBundleEventSubscriberElasticaTransformSubscriber
    arguments: ["@fpn_tag.tag_manager"]
    tags:
        - { name: kernel.event_subscriber }

相关内容

最新更新