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?
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 simplement use
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 dure
Unicode
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ètres