На протяжении всей прошлой недели я думал об этом: когда мне следует создать сервис или служебную функцию?
В ядре Drupal у нас есть функции Services и Utility, но я не могу найти различия между ними (когда мне нужно создать сервис или когда мне нужно создать сервисную функцию).
Я возьму в качестве примера модуль веса модулей, где у меня есть класс 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;
}
}
В этом классе у меня есть две статические функции, но они обе являются функциями полезности или prepareDelta()
являются функцией полезности и modulesList()
должны быть в другом классе и иметь службу?
Единственное отличие, которое я обнаружил в это время, заключается в том, что внутри пространства имен Drupal \ Component \ Utility (где вы увидите множество функций утилит) ни один из них не использует внутри службы, и обычно служба использует другие службы внутри (я не иметь обзор всех услуг, чтобы подтвердить это).
Итак, когда я должен создать сервис или служебную функцию?
Unicode
класс в ядре - это статический служебный класс, а не сервис, потому что он не имеет никаких зависимостей и не нуждается в поддержании какого-либо состояния. Если для этого требовалась зависимость от службы, шаблон DI потребовал бы его преобразования в службу, и вы использовали бы экземпляр singleton (или сгенерированный на заводе) из контейнера, когда вам это нужно. В противном случае вы можете просто use
статический класс, когда это имеет смысл.
Unicode
был бы сервис по замыслу, и это действительно не должно быть. Не забывайте, что служебные классы могут быть также легко, в некоторых отношениях легче использоваться другими модулями и другим кодом в вашем собственном модуле. Но это все зависит от вашей собственной точки зрения / опыта разработчика, в основном это сводится к тому, что здравый смысл научился нелегко
Unicode
это Drupal класс , который содержит только статические методы! Тот факт, что разработчики ядра решили реализовать его как статический класс, а не как сервис, вероятно, что-то означает, не так ли? Служебный класс на самом деле не нужно перезаписывать по своей природе - он делает некоторые вещи, если эти вещи не те, которые вы хотите, вместо этого вы пишете свой собственный класс. Помните, что вещи, которые традиционно живут в служебных классах, представляют собой однократные методы «я делаю это и ничего больше», которые не требуют ввода, кроме набора параметров