2016-09-09 85 views
0

我正在使用Drupal 8的elasticsearch连接器模块来管理索引。 https://www.drupal.org/project/elasticsearch_connector需要帮助扩展Drupal 8自定义模块中的类

我需要在索引创建时发生的一件事是在elasticsearch索引映射中添加一些分析器和过滤器。

我已经找到了这是发生在这里的create()方法为他们班的一个地方:

模块\的contrib \ elasticsearch_connector的\ src \ ElasticSearch \参数\厂\ IndexFactory.php

我有一个自定义模块,我试图扩展该方法并添加到它,但似乎无法让它着火。当它在扩展页面上显示时,我已正确启用该模块。到目前为止,我为我的自定义模块的文件夹结构如下所示:

模块\定制\ elasticsearch_analyzer的\ src \ elasticsearch_analyzer.php

<?php 

    namespace Drupal\elasticsearch_analyzer; 

    use Drupal\search_api\IndexInterface; 
    use Drupal\elasticsearch_connector\ElasticSearch\Parameters\Factory\IndexFactory; 

    class elasticsearch_analyzer extends IndexFactory { 

     /** 
     * {@inheritdoc} 
     */ 
     public static function create(IndexInterface $index) { 
     die('does this work?'); 
     return [ 
      'index' => IndexFactory::getIndexName($index), 
      'body' => [ 
      'settings' => [ 
       'number_of_shards' => $index->getOption('number_of_shards', 5), 
       'number_of_replicas' => $index->getOption('number_of_replicas', 1), 
      ], 
      ], 
     ]; 
     } 

    } 

我已经尝试了一堆围绕PSR-4标准的不同组合,但似乎无法让它运行。这是我们通常如何在Drupal 8中扩展事物的吗?我应该把这个类放在模块根目录下的.module文件中吗?我应该注册这项服务吗?

根据我读过的教程,在创建块插件或简单路由页面之外,我一直无法看到扩展贡献模块或核心的任何示例。我现在认为我们已经脱离了钩世界,我应该能够检查现有类中的代码并使用OOP继承来覆盖它。或者是不是这样?

回答

0

你不能只是扩展一个类。模块应该如何称这个新类?如何将其存在传达给其他模块,以便他们能够调用它?你的班级孤立无援。

我在阅读本模块的源代码。这个IndexFactory类用在SearchApiElasticsearchBackend类中,该类被注册为Search API模块的后端(即,搜索api知道该后端存在并调用它)。

不幸的是,这个IndexManager类只是硬编码到后端,并没有办法注入你自己的。该类只有静态方法,所以直接调用它们。即使您要创建自己的搜索后端并扩展SearchApiElasticsearchBackend,您也必须将IndexManager替换为YourCustomIndexManager

您将不得不直接在模块中更改create()方法以执行所需操作。

+0

我一直在阅读更多关于Drupal 8中的事件系统,并且使用drupal控制台已经能够看到search_api的事件列表。 search_api.task.addIndex search_api.task.trackItems search_api.task.updateIndex search_api.task.removeIndex search_api.task.deleteItems search_api.task.deleteAllIndexItems 我创建了一个模块来监听search_api。 task.addIndex,但它看起来像模块的当前版本只在“trackItems”上触发。我一直在试图看看是否有其他方法使用钩子来改变索引,但目前还没有运气。 –