ฉันมีคำถามนี้อยู่ในใจตลอดสัปดาห์ที่แล้ว: เมื่อใดที่ฉันควรสร้างบริการหรือฟังก์ชั่นยูทิลิตี้
ใน 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 ในเนมสเปซ (ที่คุณจะเห็นยูทิลิตี้จำนวนมาก fucntions) พวกเขาไม่ได้ใช้บริการใดบริการหนึ่งและมักจะใช้บริการอื่นในบริการ มีการตรวจสอบบริการทั้งหมดเพื่อตรวจสอบนี้)
ดังนั้นเมื่อฉันควรสร้างบริการหรือฟังก์ชั่นยูทิลิตี้?
Unicode
คลาสเป็นหลัก - นั่นคือคลาสยูทิลิตี้สแตติกไม่ใช่บริการเพราะมันไม่มีการอ้างอิงใด ๆ และไม่จำเป็นต้องบำรุงรักษาสถานะใด ๆ หากต้องการการพึ่งพาบริการรูปแบบ DI จะต้องการให้แปลงเป็นบริการและคุณต้องการใช้อินสแตนซ์ซิงเกิล (หรือสร้างจากโรงงาน) จากคอนเทนเนอร์เมื่อคุณต้องการ มิฉะนั้นคุณสามารถuse
คลาสคงที่เมื่อมันทำให้รู้สึก
Unicode
จะเป็นการบริการโดยการออกแบบและไม่จำเป็นต้องเป็น อย่าลืมคลาสยูทิลิตี้ที่สามารถทำได้ง่ายขึ้นได้ง่ายขึ้นในบางประเด็นใช้โมดูลอื่นและรหัสอื่นในโมดูลของคุณเอง แต่ทุกอย่างขึ้นอยู่กับมุมมอง / ประสบการณ์ของคุณในฐานะนักพัฒนาส่วนใหญ่มันจะลงมาสู่สามัญสำนึกที่เรียนรู้วิธีที่ยากลำบาก
Unicode
เป็นคลาส Drupal ที่มีเพียงวิธีคงที่! ความจริงที่ว่า core devs เลือกที่จะใช้มันเป็นคลาสแบบสแตติกแทนที่จะให้บริการอาจหมายถึงบางสิ่งที่คุณไม่คิด? คลาสยูทิลิตี้ไม่จำเป็นต้องถูกเขียนทับโดยธรรมชาติ - มันทำบางสิ่งถ้าสิ่งเหล่านั้นไม่ใช่สิ่งที่คุณต้องการคุณเขียนคลาสของคุณเองแทน โปรดจำไว้ว่าสิ่งต่าง ๆ ที่อาศัยอยู่ในคลาสยูทิลิตี้เป็นแบบ one-shot, "ฉันทำอย่างนี้และไม่มีอะไรอื่น" ประเภทของวิธีการที่ไม่จำเป็นต้องป้อนข้อมูลยกเว้นชุดของพารามิเตอร์