Ho avuto questa domanda in mente per tutta l'ultima settimana: quando dovrei creare un servizio o una funzione di utilità?
Nel Drupal Core abbiamo entrambe le funzioni Servizi e Utilità, ma non riesco a trovare la distinzione tra loro (quando devo creare un servizio o quando devo creare una funzione di utilità).
Prenderò ad esempio il modulo Modules Weight in cui ho la 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;
}
}
In questa classe ho due funzioni statiche ma sono entrambe funzioni di utilità o prepareDelta()
è una funzione di utilità e modulesList()
dovrebbe essere in un'altra classe e avere un servizio?
L'unica differenza che ho riscontrato in questo momento è che all'interno dello spazio dei nomi Drupal \ Component \ Utility (dove vedrai un sacco di programmi di utilità) nessuno di essi utilizza all'interno di un servizio e di solito un servizio utilizza altri servizi all'interno (io no rivedere tutti i servizi per convalidarlo).
Quindi, quando dovrei creare un servizio o una funzione di utilità?
Unicode
classe nel core - questa è una classe di utilità statica, non un servizio, perché non ha dipendenze e non ha bisogno di mantenere alcuno stato. Se richiedesse una dipendenza del servizio, il modello DI richiederebbe che venisse convertito in un servizio e, quando necessario, useresti l'istanza singleton (o generata dalla fabbrica) dal contenitore. Altrimenti puoi semplicemente use
classificarlo quando ha senso.
Unicode
sarebbe un servizio di progettazione, e non è proprio necessario. Non dimenticare che le classi di utilità possono essere usate altrettanto facilmente, più facilmente per certi aspetti, da altri moduli e altri codici nel tuo modulo. Ma tutto dipende dalla tua prospettiva / esperienza come sviluppatore, per lo più si ridurrà al buonsenso appreso nel modo più duro
Unicode
è una classe Drupal che contiene solo metodi statici! Il fatto che gli sviluppatori principali abbiano scelto di implementarlo come una classe statica, piuttosto che un servizio, probabilmente significa qualcosa che non pensi? Una classe di utilità non ha davvero bisogno di essere sovrascritta, per sua natura - fa alcune cose, se quelle cose non sono quelle che vuoi, scrivi invece la tua classe. Ricorda che il tipo di cose che abitualmente vivono nelle classi di utilità sono metodi one-shot, "Faccio questo e nient'altro", che non hanno bisogno di input se non un insieme di parametri