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?
sumber
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 hanyause
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 sulitUnicode
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 parameterJawaban:
Secara umum menggunakan layanan. Lihat posting blog berikut ini jika boleh menggunakan fungsi utilitas statis:
Sumber: https://stovepipe.systems/post/avoiding-static-in-your-code
(Jumlah kode statis sekarang di Drupal adalah karena transisi dari kode D7 prosedural, jadi jangan gunakan Drupal dalam keadaan saat ini sebagai contoh.)
Tentang contoh dari pertanyaan, seluruh kelas utilitas (tidak ditampilkan dalam pertanyaan)
memanggil layanan modul sendiri dalam pembungkus statis:
Ini mungkin karena kelas utilitas digunakan dalam kode prosedural lama. Dalam kode OOP ini tidak perlu, di sini Anda harus menyuntikkan layanan secara langsung.
sumber
$force = NULL
, sehingga Anda tahu jika seseorang ingin menimpa nilai konfigurasi dengan FALSE.Ya, hal keren tentang layanan adalah siapa pun dapat menimpa mereka. Jadi, jika Anda ingin memberi orang lain kemampuan untuk menyesuaikan potongan kode tertentu. Lihat Mengubah layanan yang ada, menyediakan layanan dinamis .
Selain itu, Anda harus menjadikannya layanan jika Anda perlu melakukan tes Mock untuk pengujian Unit PHP. Lihat Layanan dan injeksi ketergantungan di Drupal 8 , lihat Unit testing kelas Drupal yang lebih rumit .
Tanya Jawab:
Tes unit layanan
Unit tes menulis untuk metode yang memanggil metode statis dari kelas lain
sumber