2016-09-09 110 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」上觸發。我一直在試圖看看是否有其他方法使用鉤子來改變索引,但目前還沒有運氣。 –