Geçen hafta boyunca aklımda şu soru vardı: Ne zaman bir hizmet veya yardımcı program işlevi oluşturmalıyım?
Drupal Core'da hem Hizmetler hem de Yardımcı Program işlevlerimiz var, ancak aralarındaki farkı bulamıyorum (bir hizmet oluşturmam gerektiğinde veya bir yardımcı program işlevi oluşturmam gerektiğinde).
InternalFunctions sınıfına sahip olduğum modüller ağırlık modülünü örnek alacağım .
<?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;
}
}
Bu sınıfta iki statik işlevim var ama ikisi de yardımcı işlevler veya prepareDelta()
bir yardımcı işlev ve modulesList()
başka bir sınıfta olması ve bir hizmet olması gerekir?
Şu anda bulduğum tek fark, Drupal \ Component \ Utility (burada bir çok yardımcı program işlevi göreceksiniz) ad alanı içinde hiçbirinin bir hizmet içinde kullanmaması ve genellikle bir hizmetin içinde başka bir hizmet kullanmasıdır ( bunu doğrulamak için tüm hizmetleri inceleyin).
Peki, ne zaman bir hizmet veya yardımcı program işlevi oluşturmalıyım?
Unicode
Sınıfı temel alın - bu bir hizmet değil, statik bir yardımcı sınıftır, çünkü herhangi bir bağımlılığı yoktur ve herhangi bir durumu korumasına gerek yoktur. Bir hizmet bağımlılığı gerektiriyorsa, DI kalıbı bir hizmete dönüştürülmesini gerektirir ve gerektiğinde kaptan tekli (veya fabrikada üretilen) örneği kullanırsınız. Aksi takdirde use
, mantıklı olduğunda sadece statik sınıfı yapabilirsiniz .
Unicode
tasarım gereği bir hizmet olurdu ve gerçekten olması gerekmez. Fayda sınıflarının bazı açılardan daha kolay, daha kolay olabileceğini, kendi modülünüzdeki diğer modüller ve diğer kodlar tarafından kullanılabileceğini unutmayın. Ama her şey bir geliştirici olarak kendi bakış açınıza / deneyiminize bağlı, çoğunlukla sağduyuya inecek zor yoldan öğrendim
Unicode
ise yalnızca statik yöntemler içeren bir Drupal sınıf! Çekirdek geliştiricilerin bunu bir hizmetten ziyade statik bir sınıf olarak uygulamayı seçmiş olması, muhtemelen bir şey düşünmüyor musunuz? Bir yardımcı sınıfın doğası gereği üzerine yazılmasına gerek yoktur - bazı şeyler yapar, eğer bu şeyler istediğiniz gibi değilse, kendi sınıfınızı yazarsınız. Geleneksel olarak sınıflarda yaşayan şeylerin bir kerelik olduğunu unutmayın, "Bunu yapıyorum ve başka bir şey yapmıyorum" yöntem türleri, bir dizi parametre dışında girdiye ihtiyaç duymaz