Я мав на увазі це питання протягом усього останнього тижня: Коли я повинен створити службу чи функцію утиліти?
У Drupal Core у нас є і функції Служби, і Утиліта, але я не можу знайти їх різниці (коли мені потрібно створити службу або коли мені потрібно створити функцію утиліти).
Я візьму для прикладу модуль ваги модулів, де я маю клас 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 вимагає перетворення її в службу, і ви використовуєте одноразовий (або фабрично створений) екземпляр з контейнера, коли вам це потрібно. В іншому випадку ви можете просто use
статичний клас, коли це має сенс.
Unicode
була б послуга за задумом, а цього насправді не потрібно. Не забувайте, що класи утиліти можуть так само легко, легше, в деяких відношеннях, використовуватися іншими модулями та іншим кодом у вашому власному модулі. Але все залежить від вашої власної точки зору / досвіду як розробника, воно здебільшого зводиться до здорового глузду, засвоєного важким шляхом
Unicode
це клас Drupal, який містить лише статичні методи! Те, що основні розробники вирішили застосувати його як статичний клас, а не службу, ймовірно, означає щось, що ви не думаєте? Клас утиліти насправді не потрібно перезаписувати, за своєю природою - він робить деякі речі, якщо ці речі не такі, які ви хочете, ви замість цього пишете власний клас. Запам’ятайте такі речі, які традиційно живуть у класах корисних програм, - це одноразові методи, «я роблю це і нічого іншого», яким не потрібно введення, крім набору параметрів