Tôi đã có câu hỏi này trong suốt tuần qua: Khi nào tôi nên tạo một dịch vụ hoặc một chức năng tiện ích?
Trong Lõi Drupal, chúng tôi có cả hai chức năng Dịch vụ và Tiện ích, nhưng tôi không thể tìm thấy sự khác biệt giữa chúng (khi tôi cần tạo dịch vụ hoặc khi tôi cần tạo chức năng tiện ích).
Tôi sẽ lấy ví dụ mô-đun Trọng lượng mô-đun nơi tôi có lớp InternalFifts .
<?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;
}
}
Trong lớp này tôi có hai hàm tĩnh nhưng chúng đều là hàm tiện ích hoặc prepareDelta()
là hàm tiện ích và modulesList()
nên ở trong lớp khác và có dịch vụ?
Sự khác biệt duy nhất mà tôi tìm thấy tại thời điểm này là bên trong không gian tên Drupal \ Element \ Utility (nơi bạn sẽ thấy rất nhiều tiện ích) không ai trong số họ sử dụng bên trong một dịch vụ và thường là một dịch vụ sử dụng các dịch vụ khác bên trong (Tôi không đã xem xét tất cả các dịch vụ để xác nhận điều này).
Vì vậy, khi tôi nên tạo một dịch vụ hoặc một chức năng tiện ích?
Unicode
lớp trong lõi - đó là lớp tiện ích tĩnh, không phải dịch vụ, vì nó không có bất kỳ phụ thuộc nào và không cần duy trì bất kỳ trạng thái nào. Nếu nó yêu cầu một phụ thuộc dịch vụ, mẫu DI sẽ yêu cầu nó được chuyển đổi thành dịch vụ và bạn sẽ sử dụng thể hiện singleton (hoặc do nhà máy tạo ra) từ container khi bạn cần. Nếu không, bạn chỉ có thể use
lớp tĩnh nó khi nó có ý nghĩa.
Unicode
sẽ là một dịch vụ theo thiết kế, và nó không thực sự cần phải như vậy. Đừng quên các lớp tiện ích có thể dễ dàng, dễ dàng hơn trong một số khía cạnh, được sử dụng bởi các mô-đun khác và mã khác trong mô-đun của riêng bạn. Nhưng tất cả phụ thuộc vào quan điểm / kinh nghiệm của chính bạn với tư cách là một nhà phát triển, điều đó chủ yếu sẽ xuất phát từ lẽ thường được học theo cách khó khăn
Unicode
là một lớp Drupal chỉ chứa các phương thức tĩnh! Thực tế là các nhà phát triển cốt lõi đã chọn triển khai nó như một lớp tĩnh, thay vì một dịch vụ, có lẽ có nghĩa là điều gì đó bạn không nghĩ? Một lớp tiện ích thực sự không cần phải ghi đè, theo bản chất của nó - nó thực hiện một số thứ, nếu những thứ đó không phải là thứ bạn muốn, thay vào đó bạn viết lớp của riêng bạn. Hãy nhớ các loại phương thức truyền thống sống trong các lớp tiện ích là các kiểu phương thức "Tôi làm cái này và không có gì khác", không cần nhập liệu ngoại trừ một bộ tham số