我正在使用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 }