我正在使用 Drupal 8 的 elasticsearch 连接器模块来管理索引。 https://www.drupal.org/project/elasticsearch_connector
我需要在索引创建时做的一件事是向 elasticsearch 索引映射添加一些分析器和过滤器。
我已经在他们的一个类的 create(( 方法中追踪了这里发生的地方:
modules\contrib\elasticsearch_connector\src\ElasticSearch\Parameters\Factory\IndexFactory.php
我有一个自定义模块,我正在尝试扩展该方法并添加到其中,但似乎无法触发它。我正确启用了该模块,因为它显示在扩展页面上。到目前为止,我的自定义模块的文件夹结构如下所示:
模块\自定义\elasticsearch_analyzer\src\elasticsearch_analyzer.php
<?php
namespace Drupalelasticsearch_analyzer;
use Drupalsearch_apiIndexInterface;
use Drupalelasticsearch_connectorElasticSearchParametersFactoryIndexFactory;
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 继承覆盖它。还是不是这样?
你不能只扩展一个类。模块应该如何调用这个新类?如何将它的存在传达给其他模块,以便他们能够调用它?您的孤立类不执行任何操作。
我正在阅读这个模块的源代码。此IndexFactory
类用于注册为搜索 API 模块后端的SearchApiElasticsearchBackend
类(即搜索 API 知道此后端存在并调用它(。
可悲的是,这个IndexManager
类只是硬编码到后端,没有办法注入你自己的。该类仅具有静态方法,因此直接调用它们。即使您要创建自己的搜索后端并扩展SearchApiElasticsearchBackend
也必须在任何地方YourCustomIndexManager
替换IndexManager
。
您必须直接在模块中更改create()
方法才能执行所需的操作。