在过去的整个星期中,我一直在想这个问题:什么时候应该创建服务或实用程序功能?
在Drupal Core中,我们同时具有服务功能和实用程序功能,但是我找不到它们之间的区别(当我需要创建服务或需要创建实用程序功能时)。
我将以其中具有InternalFunctions类的Modules Weight模块为例。
<?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类,仅包含静态方法!核心开发人员选择将其实现为静态类而不是服务来实现这一事实,这可能意味着您没有想到吗?实用程序类实际上并不需要被覆盖-它可以执行某些操作,如果这些不是您想要的,您可以编写自己的类。请记住,传统上属于实用程序类的事情是一次性的“我要做而没有别的”类型的方法,除了一组参数外不需要输入