Saya memiliki pertanyaan ini dalam pikiran sepanjang minggu lalu: Kapan saya harus membuat layanan atau fungsi utilitas?
Dalam Drupal Core kami memiliki fungsi Layanan dan Utilitas, tetapi saya tidak dapat menemukan perbedaan di antara mereka (ketika saya perlu membuat layanan atau ketika saya harus membuat fungsi utilitas).
Saya akan mengambil contoh Modul Berat di mana saya memiliki kelas 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;
}
}
Di kelas ini saya memiliki dua fungsi statis tetapi keduanya adalah fungsi utilitas atau prepareDelta()
fungsi utilitas dan modulesList()
harus di kelas lain dan memiliki layanan?
Satu-satunya perbedaan yang saya temukan saat ini adalah bahwa di dalam namespace Drupal \ Component \ Utility (di mana Anda akan melihat banyak fungsi utilitas) tidak ada yang menggunakan di dalam layanan dan biasanya layanan menggunakan layanan lain di dalam (saya tidak telah meninjau semua layanan untuk memvalidasi ini).
Jadi, kapan saya harus membuat layanan atau fungsi utilitas?
Unicode
kelas dalam inti - itu adalah kelas utilitas statis, bukan layanan, karena tidak memiliki dependensi, dan tidak perlu mempertahankan status apa pun. Jika diperlukan dependensi layanan, pola DI akan mengharuskannya dikonversi ke layanan, dan Anda akan menggunakan instance singleton (atau yang dihasilkan pabrik) dari wadah saat Anda membutuhkannya. Kalau tidak, Anda bisa hanya use
kelas statis ketika masuk akal.
Unicode
akan menjadi layanan dengan desain, dan itu tidak benar-benar perlu. Jangan lupa kelas utilitas dapat dengan mudah, lebih mudah dalam beberapa hal, digunakan oleh modul lain dan kode lain di modul Anda sendiri. Tapi itu semua tergantung pada perspektif / pengalaman Anda sendiri sebagai pengembang, itu sebagian besar akan datang ke akal sehat belajar dengan cara yang sulit
Unicode
adalah kelas Drupal yang hanya berisi metode statis! Fakta bahwa dev inti memilih untuk mengimplementasikannya sebagai kelas statis, daripada layanan, mungkin berarti sesuatu yang tidak Anda pikirkan? Kelas utilitas tidak benar-benar perlu ditimpa, berdasarkan sifatnya - ia melakukan beberapa hal, jika hal-hal itu tidak sesuai keinginan Anda, Anda menulis kelas sendiri. Ingatlah jenis-jenis hal yang secara tradisional hidup dalam kelas utilitas adalah sekali pakai, jenis metode "Saya melakukan ini dan tidak ada yang lain", yang tidak memerlukan input kecuali seperangkat parameter