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?
fuente
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 simplementeuse
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ícilUnicode
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ámetrosRespuestas:
En general servicios de uso. Consulte la siguiente publicación de blog cuando esté bien usar funciones de utilidad estáticas:
Fuente: https://stovepipe.systems/post/avoiding-static-in-your-code
(La cantidad de código estático ahora en Drupal se debe a la transición del código de procedimiento D7, así que no use Drupal en el estado actual como ejemplo).
Sobre el ejemplo de la pregunta, el resto de la clase de utilidad (no se muestra en la pregunta)
llama al servicio propio del módulo en un contenedor estático:
Esto probablemente se deba a que la clase de utilidad se usa en código de procedimiento heredado. En el código OOP esto no es necesario, aquí debe inyectar el servicio directamente.
fuente
$force = NULL
, para saber si alguien quiere anular el valor de configuración con un FALSO.Sí, lo bueno de los servicios es que cualquiera puede sobrescribirlos. Entonces, si desea dar a otras personas la capacidad de personalizar un fragmento de código en particular. Consulte Alteración de servicios existentes, prestación de servicios dinámicos .
Además, debe hacer que sea un servicio si necesita hacer una prueba simulada para pruebas de unidad PHP. Consulte Servicios e inyección de dependencias en Drupal 8 , consulte Unidad de prueba de clases de Drupal más complicadas .
Q & A:
Prueba de unidad de servicio
Escribir pruebas unitarias para un método que llama a métodos estáticos de otra clase
fuente