지난 주 내내이 질문을 염두에 두었습니다. 언제 서비스 나 유틸리티 함수를 작성해야합니까?
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
있다 정적 메소드를 포함하는 드루팔 클래스! 핵심 개발자가 서비스가 아닌 정적 클래스로 구현하기로 선택한 사실은 아마도 당신이 생각하지 않는 것을 의미합니까? 유틸리티 클래스는 본질적으로 본질적으로 덮어 쓸 필요가 없습니다. 원하는 것들이 아닌 경우, 클래스를 직접 작성하십시오. 유틸리티 클래스에 전통적으로 존재하는 것은 일종의 매개 변수 인 "입력하지 않아도됩니다"라는 매개 변수 유형을 기억하십시오