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?
fonte
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 apenasuse
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ícilUnicode
é 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.Respostas:
Em serviços de uso geral. Consulte a seguinte postagem no blog quando estiver OK para usar funções de utilitário estático:
Fonte: https://stovepipe.systems/post/avoiding-static-in-your-code
(A quantidade de código estático agora no Drupal é devido à transição do código processual D7, portanto, não use o Drupal no estado atual como exemplo.)
Sobre o exemplo da pergunta, o restante da classe de utilitário (não mostrado na pergunta)
chama o serviço próprio do módulo em um wrapper estático:
Provavelmente, isso ocorre porque a classe de utilitário é usada no código processual herdado. No código OOP, isso não é necessário, aqui você deve injetar o serviço diretamente.
fonte
$force = NULL
, para saber se alguém deseja substituir o valor de configuração por um FALSE.Sim, uma coisa interessante sobre serviços é que qualquer um pode substituí-los. Portanto, se você deseja dar a outras pessoas a capacidade de personalizar um pedaço de código específico. Consulte Alterando serviços existentes, fornecendo serviços dinâmicos .
Além disso, você deve torná-lo um serviço se precisar fazer o teste Mock para o teste de unidade PHP. Consulte Serviços e injeção de dependência no Drupal 8 , consulte Unidade de teste de classes Drupal mais complicadas .
Perguntas e Respostas:
Teste de unidade de serviço
Escrevendo testes de unidade para um método que chama métodos estáticos de outra classe
fonte