На протяжении всей прошлой недели я думал об этом: когда мне следует создать сервис или служебную функцию?
В ядре 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 класс , который содержит только статические методы! Тот факт, что разработчики ядра решили реализовать его как статический класс, а не как сервис, вероятно, что-то означает, не так ли? Служебный класс на самом деле не нужно перезаписывать по своей природе - он делает некоторые вещи, если эти вещи не те, которые вы хотите, вместо этого вы пишете свой собственный класс. Помните, что вещи, которые традиционно живут в служебных классах, представляют собой однократные методы «я делаю это и ничего больше», которые не требуют ввода, кроме набора параметровОтветы:
В общем пользуюсь услугами. См. Следующий пост в блоге, когда можно использовать статические служебные функции:
Источник: https://stovepipe.systems/post/avoiding-static-in-your-code
(Количество статического кода в Drupal теперь связано с переходом от процедурного кода D7, поэтому не используйте Drupal в текущем состоянии в качестве примера.)
О примере из вопроса, остальной части служебного класса (не показано в вопросе)
вызывает собственный сервис модуля в статической оболочке:
Вероятно, это связано с тем, что служебный класс используется в устаревшем процедурном коде. В ООП-коде это не обязательно, здесь вы должны внедрить сервис напрямую.
источник
$force = NULL
, чтобы вы знали, если кто-то хочет переопределить значение конфигурации с помощью FALSE.Да, классная вещь об услугах в том, что каждый может их перезаписать. Поэтому, если вы хотите дать другим людям возможность настраивать определенный фрагмент кода. См. Изменение существующих сервисов, предоставление динамических сервисов .
Кроме того, вы должны сделать это сервисом, если вам нужно провести пробное тестирование для PHP модульного тестирования. См. Сервисы и внедрение зависимостей в Drupal 8 , см. Модульное тестирование более сложных классов Drupal .
Q & A:
Сервисный тест
Написание модульных тестов для метода, который вызывает статические методы из другого класса
источник