2016-09-09 1 views
0

저는 Drupal 8 용 elasticsearch 커넥터 모듈을 사용하여 색인을 관리하고 있습니다. https://www.drupal.org/project/elasticsearch_connectorDrupal 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)에서 일을 연장하는 방법입니까? 이 클래스를 모듈의 루트에있는 모듈 파일에 두어야합니까? 이 서비스에 등록해야합니까?

내가 읽은 튜토리얼을 기반으로, 블록 플러그인이나 단순 경로 페이지를 만들지 않고 기여한 모듈이나 코어를 확장하는 사례를 볼 수 없었습니다. 이제는 기존 클래스의 코드를 검사하고 OOP 상속을 사용하여 재정의 할 수 있어야합니다. 그렇지 않은가요?

답변

0

클래스를 확장 할 수는 없습니다. 모듈이이 새 클래스를 어떻게 호출해야합니까? 그 존재를 다른 모듈과 통신하여 어떻게 호출 할 수 있습니까? 고립되어있는 수업은 아무 것도하지 않습니다.

이 모듈의 소스 코드를 통해 읽었습니다. 이 IndexFactory 클래스는 검색 API 모듈의 백엔드로 등록 된 SearchApiElasticsearchBackend 클래스에서 사용됩니다. 즉, 검색 API는이 백엔드가 존재하며이를 호출 함을 알고 있습니다.

슬프게도이 IndexManager 클래스는 백엔드에 하드 코딩되고 사용자 자신을 삽입 할 수있는 방법이 없습니다. 클래스에는 정적 메소드 만 있으므로 직접 호출됩니다. 자신의 검색 백엔드를 만들고 SearchApiElasticsearchBackend을 확장하더라도 IndexManagerYourCustomIndexManager으로 대체해야합니다.

원하는대로 모듈에서 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을 수신 할 수있는 모듈을 만든 search_api.task.deleteAllIndexItems. task.addIndex하지만 현재 버전의 모듈은 "trackItems"에서만 실행됩니다. 나는 후크를 사용하여 인덱스를 변경하는 다른 방법이 있는지 알아 보려고했지만 지금까지는 행운이 없습니다. –

관련 문제