Eu tive essa pergunta em mente durante toda a última semana: Quando devo criar um serviço ou uma função de utilitário?
No Drupal Core, temos as funções Serviços e Utilitários, mas não consigo encontrar a distinção entre elas (quando preciso criar um serviço ou quando preciso criar uma função utilitária).
Tomarei como exemplo o módulo Modules Weight , onde tenho a 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;
}
}
Nesta classe, eu tenho duas funções estáticas, mas elas são funções utilitárias ou prepareDelta()
é uma função utilitária e modulesList()
devem estar em outra classe e ter um serviço?
A única diferença que encontrei nesse momento é que, dentro do espaço de nome Drupal \ Component \ Utility (onde você verá muitas funções de utilidade), nenhuma delas usa dentro de um serviço e, geralmente, um serviço usa outros serviços (eu não revise todos os serviços para validar isso).
Então, quando devo criar um serviço ou uma função de utilitário?
Unicode
classe no núcleo - é uma classe de utilitário estático, não um serviço, porque não possui dependências e não precisa manter nenhum estado. Se exigisse uma dependência de serviço, o padrão de DI exigiria a conversão para um serviço e você usaria a instância singleton (ou gerada de fábrica) do contêiner quando necessário. Caso contrário, você pode apenas use
a classe estática quando faz sentido.
Unicode
seria um serviço por design e realmente não precisa ser. Não se esqueça de que as classes de utilitário podem, com a mesma facilidade e facilidade em alguns aspectos, ser usadas por outros módulos e outro código em seu próprio módulo. Mas tudo isso depende da sua própria perspectiva / experiência como desenvolvedor, principalmente o senso comum aprendido da maneira mais difícil
Unicode
é uma classe Drupal que contém apenas métodos estáticos! O fato de os desenvolvedores principais escolherem implementá-lo como uma classe estática, em vez de um serviço, provavelmente significa algo que você não acha? Uma classe de utilitário realmente não precisa ser substituída, por sua natureza - ela faz algumas coisas, se essas coisas não são o que você deseja, você escreve sua própria classe. Lembre-se do tipo de coisas que tradicionalmente vivem em classes de utilidade são os métodos de métodos "Eu faço isso e nada mais", que não precisam de entrada, exceto um conjunto de parâmetros.