私は先週ずっとこの質問を念頭に置いていました:サービスまたはユーティリティ関数をいつ作成するべきですか?
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;
}
}
このクラスには2つの静的関数がありますが、どちらもユーティリティ関数であるかprepareDelta()
、ユーティリティ関数でありmodulesList()
、別のクラスに属していてサービスを持つ必要がありますか?
現時点で私が見つけた唯一の違いは、名前空間Drupal \ Component \ Utility(多くのユーティリティ機能が表示されます)内ではサービス内で使用せず、通常、サービスは内部で別のサービスを使用することです(私はしません)これを検証するためにすべてのサービスを確認してください)。
それで、サービスまたはユーティリティ関数をいつ作成する必要がありますか?
Unicode
コアのクラスを取り上げます。これは依存関係がなく、状態を維持する必要がないため、サービスではなく静的ユーティリティクラスです。サービスの依存関係が必要な場合は、DIパターンでサービスに変換する必要があり、必要に応じてコンテナーからシングルトン(またはファクトリー生成)インスタンスを使用します。それ以外の場合はuse
、それが理にかなっている場合は、静的クラスを使用できます。
Unicode
、それは設計によるサービスであり、実際にそうである必要はありません。ユーティリティクラスは、いくつかの点で同じくらい簡単に、より簡単に、他のモジュールや独自のモジュール内の他のコードで使用できることを忘れないでください。しかし、それはすべて、開発者としてのあなた自身の見方/経験に依存します。それは主に常識に帰着し、難しい方法で学んだ
Unicode
あるだけの静的メソッドが含まれているDrupalのクラス!コア開発者がそれをサービスではなく静的クラスとして実装することを選択したという事実は、おそらくあなたは何かを意味しませんか?ユーティリティクラスは、その性質上、実際に上書きする必要はありません-いくつかのことを行いますが、それらが望んでいない場合は、代わりに独自のクラスを記述します。ユーティリティクラスに伝統的に存在する種類のものは、ワンショットの「私はこれで他に何もしない」タイプのメソッドであり、パラメータのセットを除いて入力を必要としないことを思い出してください