我使用FPNTagBudle标记我的文档,使用FOSElasticaBundle将它们索引到elasticsearch索引中。
使用FPNTagBudle将标签加载到对象中,您需要使用loadTagging方法,如下所示:
$tagManager = $this->get('fpn_tag.tag_manager');
$tagManager->loadTagging($object);当从表单编辑对象时,我加载了标签,所以一切都正常工作,当对象被保存时,索引被正确地建立起来。问题是,当我运行fos:elastica:populate命令来填充所有对象时,标记被跳过了,因为那时没有加载标记。
我试图在那里连接到PRE_TRANSFORM事件和loadTagging,但是它搞乱了表单,因为第二次调用loadTagging会擦除从表单添加的新标记。
有没有可能在PRE_TRANSFORM钩子中识别出这是填充命令,这样我才能loadTagging?或者,也许我的问题更根本?
发布于 2018-02-04 01:47:15
我决定使用PRE_TRANSFORM事件,并用php_sapi_name()来区分它是来自表单还是填充命令。下面是整个解决方案:
订户
<?php
namespace AppBundle\EventSubscriber;
use FOS\ElasticaBundle\Event\TransformEvent;
use FPN\TagBundle\Entity\TagManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class ElasticaTransformSubscriber
* @package AppBundle\EventSubscriber
*/
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: AppBundle\EventSubscriber\ElasticaTransformSubscriber
arguments: ["@fpn_tag.tag_manager"]
tags:
- { name: kernel.event_subscriber }https://stackoverflow.com/questions/48250536
复制相似问题