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ą?
źródło
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 prostuuse
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órzeUnicode
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ówOdpowiedzi:
W ogólnym użyciu usługi. Zobacz następujący post na blogu, gdy korzystanie ze statycznych funkcji narzędzia jest w porządku:
Źródło: https://stovepipe.systems/post/avoiding-static-in-your-code
(Ilość kodu statycznego teraz w Drupal wynika z przejścia od kodu D7 proceduralnego, więc nie używaj Drupala w obecnym stanie jako przykładu.)
O przykładzie z pytania, reszcie klasy użyteczności (nie pokazanej w pytaniu)
wywołuje własną usługę modułu w statycznym opakowaniu:
Jest tak prawdopodobnie dlatego, że klasa użyteczności jest używana w starszym kodzie proceduralnym. W kodzie OOP nie jest to konieczne, tutaj należy wstrzyknąć usługę bezpośrednio.
źródło
$force = NULL
, abyś wiedział, czy ktoś chce zastąpić wartość konfiguracji FALSE.Tak, fajną rzeczą w usługach jest to, że każdy może je zastąpić. Więc jeśli chcesz dać innym ludziom możliwość dostosowania określonego fragmentu kodu. Zobacz Zmiana istniejących usług, dostarczanie usług dynamicznych .
Ponadto powinieneś uczynić go usługą, jeśli chcesz wykonać próbny test do testowania jednostek PHP. Zobacz Usługi i wstrzykiwanie zależności w Drupal 8 , zobacz Testowanie jednostek bardziej skomplikowanych klas Drupal .
Pytania i odpowiedzi:
Test jednostki serwisowej
Pisanie testów jednostkowych dla metody wywołującej metody statyczne z innej klasy
źródło