J'ai eu cette question en tête toute la semaine dernière: quand devrais-je créer un service ou une fonction utilitaire?
Dans le Drupal Core, nous avons à la fois des services et des fonctions utilitaires, mais je ne trouve pas la distinction entre eux (quand j'ai besoin de créer un service ou quand j'ai besoin de créer une fonction utilitaire).
Je vais prendre comme exemple le module Modules Weight où j'ai la classe InternalFunctions .
<?php
namespace Drupal\modules_weight\Utility;
class InternalFunctions {
public static function prepareDelta($weight) {
$delta = 100;
$weight = (int) $weight;
if ($weight > $delta) {
return $weight;
}
if ($weight < -100) {
return $weight * -1;
}
return $delta;
}
public static function modulesList($force = FALSE) {
$modules = [];
$installed_modules = system_get_info('module');
$config_factory = \Drupal::service('config.factory');
if ($force) {
$show_system_modules = TRUE;
}
else {
modules.
$show_system_modules = $config_factory->get('modules_weight.settings')->get('show_system_modules');
}
$modules_weight = $config_factory->get('core.extension')->get('module');
foreach ($installed_modules as $filename => $module_info) {
if (!isset($module_info['hidden']) && ($show_system_modules || $module_info['package'] != 'Core')) {
$modules[$filename]['name'] = $module_info['name'];
$modules[$filename]['description'] = $module_info['description'];
$modules[$filename]['weight'] = $modules_weight[$filename];
$modules[$filename]['package'] = $module_info['package'];
}
}
uasort($modules, ['Drupal\Component\Utility\SortArray', 'sortByWeightElement']);
return $modules;
}
}
Dans cette classe, j'ai deux fonctions statiques, mais ce sont toutes les deux des fonctions utilitaires ou prepareDelta()
une fonction utilitaire et modulesList()
devraient être dans une autre classe et avoir un service?
La seule différence que j'ai trouvée à ce moment est qu'à l'intérieur de l'espace de noms Drupal \ Component \ Utility (où vous verrez beaucoup de fonctions utilitaires) aucun d'eux n'utilise à l'intérieur d'un service et généralement un service utilise un autre service à l'intérieur (je ne le fais pas avoir revu tous les services pour valider cela).
Alors, quand devrais-je créer un service ou une fonction utilitaire?
la source
Unicode
classe au cœur - c'est une classe d'utilité statique, pas un service, car elle n'a pas de dépendances et n'a pas besoin de maintenir aucun état. S'il nécessitait une dépendance de service, le modèle DI nécessiterait qu'il soit converti en service, et vous utiliseriez l'instance singleton (ou générée en usine) à partir du conteneur lorsque vous en auriez besoin. Sinon, vous pouvez simplementuse
la classe statique lorsque cela a un sens.Unicode
serait un service par conception, et ce n'est pas vraiment nécessaire. N'oubliez pas que les classes utilitaires peuvent tout aussi bien, plus facilement à certains égards, être utilisées par d'autres modules et d'autres codes dans votre propre module. Mais tout dépend de votre propre perspective / expérience en tant que développeur, cela dépendra essentiellement du bon sens appris à la dureUnicode
est une classe Drupal qui ne contient que des méthodes statiques! Le fait que les développeurs principaux aient choisi de l'implémenter en tant que classe statique, plutôt qu'en tant que service, signifie probablement quelque chose que vous ne pensez pas? Une classe utilitaire n'a pas vraiment besoin d'être écrasée, de par sa nature - elle fait certaines choses, si ces choses ne sont pas ce que vous voulez, vous écrivez votre propre classe à la place. Rappelez-vous que le genre de choses qui vivent traditionnellement dans les classes utilitaires sont des méthodes à usage unique, "je fais ça et rien d'autre", qui n'ont besoin d'entrée que d'un ensemble de paramètresRéponses:
Dans les services à usage général. Consultez le billet de blog suivant lorsqu'il est OK d'utiliser des fonctions utilitaires statiques:
Source: https://stovepipe.systems/post/avoiding-static-in-your-code
(La quantité de code statique maintenant dans Drupal est due à la transition du code procédural D7, donc n'utilisez pas Drupal dans l'état actuel comme exemple.)
À propos de l'exemple de la question, le reste de la classe d'utilité (non montré dans la question)
appelle le propre service du module dans un wrapper statique:
Cela est probablement dû au fait que la classe utilitaire est utilisée dans le code procédural hérité. Dans le code POO, cela n'est pas nécessaire, vous devez ici injecter le service directement.
la source
$force = NULL
, afin de savoir si quelqu'un veut remplacer la valeur de configuration par un FAUX.Oui, une chose intéressante à propos des services est que n'importe qui peut les remplacer. Donc, si vous souhaitez donner à d'autres personnes la possibilité de personnaliser un morceau de code particulier. Voir Modification des services existants, fourniture de services dynamiques .
De plus, vous devriez en faire un service si vous avez besoin de faire un test Mock pour les tests unitaires PHP. Voir Services et injection de dépendances dans Drupal 8 , voir Tests unitaires de classes Drupal plus compliquées .
Q & R:
Test d'unité de service
Écriture de tests unitaires pour une méthode qui appelle des méthodes statiques d'une autre classe
la source