Przez cały tydzień myślałem o tym: kiedy powinienem stworzyć usługę lub funkcję użyteczności?
W Drupal Core mamy zarówno funkcje Usługi, jak i Narzędzie, ale nie mogę znaleźć rozróżnienia między nimi (kiedy muszę utworzyć usługę lub kiedy muszę utworzyć funkcję narzędzia).
Jako przykład wezmę moduł Moduły wagi , w którym mam klasę 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;
}
}
W tej klasie mam dwie funkcje statyczne, ale obie są funkcjami użytecznymi, czy też prepareDelta()
są funkcjami użytecznymi i modulesList()
powinny być w innej klasie i mieć usługę?
Jedyną różnicą, którą znalazłem w tym momencie, jest to, że w przestrzeni nazw Drupal \ Component \ Utility (gdzie zobaczysz wiele funkcji narzędzi) żadna z nich nie korzysta z usługi i zwykle usługa korzysta z innych usług w środku (ja nie przejrzyj wszystkie usługi, aby to potwierdzić).
Kiedy więc powinienem utworzyć usługę lub funkcję narzędziową?
Unicode
klasę w rdzeniu - jest to statyczna klasa użyteczności, a nie usługa, ponieważ nie ma żadnych zależności i nie musi utrzymywać żadnego stanu. Jeśli wymagałaby zależności usługowej, wzorzec DI wymagałby przekształcenia go w usługę i używałbyś instancji singletonu (lub generowanej fabrycznie) z kontenera, gdy byłeś potrzebny. W przeciwnym razie możesz po prostu use
klasę statyczną, gdy ma to sens.
Unicode
byłaby to usługa z założenia i tak naprawdę nie musi być. Nie zapominaj, że klasy narzędzi mogą być równie łatwo, pod pewnymi względami, używane przez inne moduły i inny kod we własnym module. Ale to wszystko zależy od twojej perspektywy / doświadczenia jako programisty, głównie sprowadza się to do zdrowego rozsądku, którego nauczyłeś się na własnej skórze
Unicode
to klasa Drupal, która zawiera tylko metody statyczne! Fakt, że rdzeniowcy zdecydowali się na implementację go jako klasy statycznej, a nie usługi, prawdopodobnie oznacza coś, co nie sądzisz? Klasa użyteczności tak naprawdę nie musi być nadpisywana ze swojej natury - robi pewne rzeczy, jeśli te rzeczy nie są tym, czego chcesz, zamiast tego piszesz własną klasę. Pamiętaj, że rzeczy, które tradycyjnie żyją w klasach użyteczności, to jednorazowe metody typu „robię to i nic więcej”, które nie wymagają wprowadzania danych oprócz zestawu parametrów