Comment utiliser le modèle de conception singleton avec Elasticsearch dans Drupal 9
Le modèle de conception singleton est vraiment utile pour utiliser le même objet sur plusieurs appels. Pour les logiciels tiers, par exemple Apache Solr, elastic search, Redis, etc., il n’est pas recommandé de créer l’objet de connexion encore et encore, mais un seul objet peut être utilisé plusieurs fois. Dans de tels cas, des modèles de conception singleton peuvent être utilisés.
Drupal est suffisamment flexible pour s’intégrer à de nombreuses bibliothèques, nous allons choisir connecteur elasticsearch intégration de module avec Drupal 9 par exemple.
Nous allons créer une classe simple qui se connectera au serveur elasticsearch et renverra l’objet client elasticsearch.
Pour elasticsearch, Connecteur ElasticSearch module est utilisé.
Nous allons créer des services pour atteindre l’objet singleton d’elasticsearch. Il y a deux services que nous utiliserons pour obtenir les objets, l’un sera une méthode directe et l’autre sera une méthode indirecte.
Conformément aux directives, un module personnalisé doit être créé. Les fichiers mentionnés ci-dessous doivent être créés.
Nom du fichier : nom_du_module.services.yml
prestations de service:
elastic_singleton.indirect_object:
classe: Drupal\elastic_singleton\ElasticInitiate
elastic_singleton.direct_object:
classe: Drupal\elastic_singleton\ElasticSingleton
Nous allons créer le premier service qui fournit des objets directs selon la demande.
Nom du fichier : src/ElasticSingleton.php
/**
* @dossier
* Contient le singleton ElasticSingleton.
*/
espace de noms Drupal\nom_module ;
utilisez Elasticsearch\ClientBuilder ;
classe ElasticSingleton {
instance privée statique $ = NULL ;
/**
* Vérifie la connectivité avec ElasticSearch.
*/
fonction statique privée getClient() {
essayer {
$elastic_host = ‘127.0.0.1’; // Serveur Elasticsearch.
$client = ClientBuilder::create()
->setHosts([$elastic_host])
->construire();
$santé = $client->cluster()->santé();
si (vide($santé)) {
renvoie FAUX ;
}
retourne $client ;
}
attraper (\Exception $e) {
renvoie FAUX ;
}
}
/**ElasticSingleton.phpElasticSingleton.php
* Vérifiez la connectivité getInstance.
*/
fonction statique publique getInstance() {
if(self::$instance === NULL) {
self::$instance = self::getClient();
}
return self ::$instance;
}
}
Nous allons maintenant créer un deuxième service qui fournira le même objet mais indirectement ou en utilisant sans propriété statique/sans utiliser d’opérateur de résolution de portée.
/**
* @dossier
* Fournit un objet indirect d’elasticsearch.
*/
espace de noms Drupal\elastic_singleton ;
utiliser Drupal\elastic_singleton\ElasticSingleton ;
classe ElasticInitiate {
/**
* Vérifie la connectivité avec ElasticSearch.
*/
Publique une fonction getInstance() {
retourner ElasticSingleton::getInstance();
}
}
Pour tester, nous pouvons créer une entrée dans le fichier routing.yml.
Fichier : nomdumodule.routing.yml
élastique.test_singleton:
chemin: ‘/test/élastique/singleton’
valeurs par défaut:
_manette: ‘\Drupal\elastic_singleton\Controller\ElasticController::test’
conditions:
_autorisation: ‘accéder au contenu’
Créons un contrôleur dans le dossier src/Controller.
Nom du fichier : ElasticController.php
espace de noms Drupal\elastic_singleton\Controller ;
utiliser Drupal\Core\Controller\ControllerBase ;
/**
* Un contrôleur de test singleton Elasticsearch.
*/
classe Contrôleur élastique s’étend ContrôleurBase {
/**
* Renvoie un tableau pouvant être rendu pour une page de test.
*/
Publique une fonction test() {
$client = \Drupal::service(‘elastic_singleton.direct_object’)::getInstance();
var_dump ($ client);
$client1 = \Drupal::service(‘elastic_singleton.indirect_object’)->getInstance();
var_dump ($ client);
// sortie(); // Décommentez cette ligne pour vérifier les deux objets client.
$build = [
‘#markup’ => $this->t(‘Elasticsearch Singleton example.’),
];
retourner $build ;
}
}
Nous pouvons appeler le service aux endroits souhaités et nous pouvons remarquer que le même objet est renvoyé plusieurs fois.
TROUVÉ CELA UTILE ? PARTAGEZ-LE
Source link