Fermer

novembre 28, 2022

Services et injection de dépendances dans Drupal


Drupal 8+ est basé sur les services et de nombreux endroits du système disponibles via l’injection de dépendance. Il est donc important de comprendre le concept de services et DI.

Prestations de service : Le service est tout objet géré par le conteneur de services. ou nous pouvons dire que services est une simple classe PHP avec quelques méthodes. nous pouvons accéder à ces services et méthodes n’importe où dans l’application à l’aide du conteneur de services.

Le service peut être utilisé de la manière suivante. Nous utilisons la méthode \Drupal::service() pour obtenir un objet AliasManager instancié, puis utilisons une fonction dans cet objet pour traduire le chemin vers l’alias.

$aliasManager = \Drupal::service(‘path_alias.manager’);
$chemin = ‘/noeud/123’;
$alias = $aliasManager->getAliasByPath($path);

Accéder aux services : Les services sont tous définis dans des fichiers YML dans Drupal. Chaque module qui veut définir un service doit créer un fichier avec le nom de [module name].services.yml . Pour trouver tous les services disponibles dans Drupal, vous pouvez suivre le liste des prestations .

La meilleure pratique pour accéder aux services consiste donc à injecter des dépendances au lieu d’appeler directement le conteneur de services global Drupal.

Injection de dépendance : L’injection de dépendance est un modèle de conception dans lequel un objet ou une fonction reçoit d’autres objets ou fonctions dont il dépend. Cela signifie que nous pouvons directement injecter les services dans la méthode de classe __construct, et cela chargera le runtime de dépendance lors de l’instanciation de la classe.

Pourquoi utiliser DI dans Drupal :

  1. Fonctionnalité découplée
  2. Facilite les tests unitaires
  3. Code réutilisable et flexible
  4. Code plus propre
  5. Récupérer les dépendances du conteneur est meilleur pour les performances.

Comment injecter de la dépendance :

Avant d’implémenter le DI, regardons le code sans DI. J’affiche donc simplement le nom d’utilisateur actuel dans la fonction de rendu. Dans les lignes de code ci-dessous n ° 13 et 14, j’utilise la fonction Drupal pour obtenir le nom d’utilisateur,

Exemple de code sans DI.

cela fonctionne aussi bien mais Drupal recommande d’utiliser Dependency Injection partout. Commençons donc à injecter l’injection de dépendance sur la même base de code.

Exemple code Avec DI :

Exemple 1: DI avec contrôleur

J’ai créé la fonction de rendu simple dans le contrôleur. Ici, j’utilise l’injection de dépendance pour obtenir les détails de l’utilisateur actuel en fonction des services current_user.

Il existe 2 fonctions principales pour exécuter le DI dans Drupal __construct() & create().

__Méthode de construction : Avec dans la méthode de construction, nous définissons tous les services dont nous avons besoin en tant que DI.

Créer une méthode : La méthode Create () est une méthode de fabrique basée sur le modèle de conception de fabrique.

La méthode create() nous aide à créer l’instance de tous les services que nous passons dans la méthode create(). Return new static() signifie « Renvoyer une nouvelle instance de la classe actuelle, en utilisant les arguments passés dans le constructeur de la classe »

Donc, techniquement, tous les arguments et l’ordre des arguments seraient les mêmes dans les fonctions create() et construct().

ID dans Drupal

Comme ci-dessus, nous pouvons définir le DI dans FormBase, configFormBase, etc.

Exemple 2 : DDépendance Injection dans sservices classer

Pour les services DI nous prenons l’exemple du core node.service.yml

prestations de 2

C’est dire que pour le node.grant_storage
service,

la Drupal\node\NodeGrantDatabaseStorage
class sera utilisé et trois arguments lui seront passés lors de la création d’une instance de celui-ci.

La @ signifie qu’il s’agit d’instances d’autres services. Un exemple d’un database services, un module_handler service, et un language_manager service sera fourni à ce service node.grant_storage. Ces services ne sont que des objets de types désignés.

Voici la partie pertinente du NodeGrantDatabaseStorge classer. J’ai ajouté des sauts de ligne à ceci et à d’autres exemples de code pour plus de lisibilité.

classe de services

Les trois arguments utilisés dans le constructeur correspondent aux trois arguments définis dans le fichier services. Les objets passés sont ensuite stockés en tant que propriétés de la classe. En d’autres termes, les trois objets (dépendances) ont été injectés dans la classe client (NodeGrantDatabaseStorage) par le système de services.Exemple 3 : Injection de dépendances à l’intérieur du bloc (plugin)

Exemple 3 : Injection de dépendances à l’intérieur du bloc (plugin)

Nous pouvons injecter notre service personnalisé/core dans notre plugin de bloc personnalisé pour cela que nous devons utiliser.

use Drupal\Core\Plugin\ContainerFactoryPluginInterface; Suppose you have a custom block with the name 'drupalise' then you inject your custom service 'drupalise' inside your custom block code as follows: Plugins par

Ici drupalise est mon service personnalisé qui a la fonction Drupalise().

C’est tout dans l’injection de dépendance Drupal. Bonne Drupaling.

 




Source link

novembre 28, 2022