Tuve esta pregunta en mente durante toda la última semana: ¿Cuándo debería crear un servicio o una función de utilidad?
En Drupal Core tenemos funciones tanto de Servicios como de Utilidades, pero no puedo encontrar la distinción entre ellas (cuando necesito crear un servicio o cuando necesito crear una función de utilidad).
Tomaré como ejemplo el módulo Módulos Peso donde tengo la clase 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;
}
}
En esta clase tengo dos funciones estáticas, pero ambas son funciones de utilidad o prepareDelta()
es una función de utilidad y modulesList()
deberían estar en otra clase y tener un servicio.
La única diferencia que encontré en este momento es que dentro del espacio de nombres Drupal \ Component \ Utility (donde verá muchas funciones de utilidad) ninguno de ellos usa dentro de un servicio y generalmente un servicio usa otros servicios dentro (no revise todos los servicios para validar esto).
Entonces, ¿cuándo debo crear un servicio o una función de utilidad?
Unicode
clase en el núcleo: es una clase de utilidad estática, no un servicio, porque no tiene dependencias y no necesita mantener ningún estado. Si requería una dependencia de servicio, el patrón DI requeriría que se convirtiera en un servicio, y usaría la instancia singleton (o generada de fábrica) del contenedor cuando lo necesitara. De lo contrario, puede simplemente use
la clase estática cuando tenga sentido.
Unicode
sería un servicio por diseño, y realmente no es necesario. No olvide que las clases de utilidades pueden ser utilizadas, más fácilmente, en algunos aspectos, por otros módulos y otro código en su propio módulo. Pero todo eso depende de su propia perspectiva / experiencia como desarrollador, en su mayoría se reducirá al sentido común aprendido de la manera difícil
Unicode
es una clase de Drupal que contiene solo métodos estáticos. El hecho de que los desarrolladores principales eligieron implementarlo como una clase estática, en lugar de un servicio, probablemente significa algo, ¿no crees? Una clase de utilidad realmente no necesita ser sobrescrita, por su naturaleza: hace algunas cosas, si esas cosas no son lo que quieres, debes escribir tu propia clase. Recuerde que el tipo de cosas que tradicionalmente viven en las clases de utilidad son los métodos de una sola vez, "Hago esto y nada más", que no necesitan entrada excepto un conjunto de parámetros