如何从Elastic结果到Doctrine实体创建自定义转换器

Fra*_*eni 2 symfony elasticsearch foselasticabundle

TL;博士

如何将基础变换器从弹性结果扩展/覆盖到FosElasticaBundle中的Doctrine实体?

细节

我想更改transform方法,FOS\ElasticaBundle\Doctrine\AbstractElasticaToModelTransformer以便我可以向检索到的实体添加自定义属性.

我通过黑客攻击方法测试,它完全按照我的意愿工作.

在没有黑客攻击的情况下覆盖/扩展该方法的最佳解决方案是什么?

Fra*_*eni 11

您可以通过创建新服务来覆盖变换器并定义自己的变换器.完整的故事可以在http://obtao.com/blog/2014/05/advanced-indexing-with-elasticsearch-foselasticabundle/上阅读.

简而言之:首先你定义一个这样的服务(在我的例子中我只索引一个特定的实体):

myapp.elastica_to_model.transformer.company:
    class: AppBundle\Transformers\ElasticaToCompanyTransformer
    arguments: [ @doctrine, "AppBundle\Entity\Company" ]
    calls:
        - [ setPropertyAccessor, ["@fos_elastica.property_accessor"] ]
    tags:
        - { name: fos_elastica.elastica_to_model_transformer.app.company }
Run Code Online (Sandbox Code Playgroud)

然后创建实际的服务类,在其中扩展原始转换器并覆盖该transform方法.

最后你告诉FosElastica使用这个变换器而不是原来的变换器:

fos_elastica:
    indexes:
        app:
            types:
                company:
                    mappings:
                        ...
                    persistence:
                        ...
                        elastica_to_model_transformer:
                            service: myapp.elastica_to_model.transformer.company
Run Code Online (Sandbox Code Playgroud)