希望:複数クラスで依存されるクラスのSingleton化を楽に管理したい
複数のクラスで依存されるSingletonにしても問題がいないクラスだけを、ServiceProviderで同じインスタンスが取得されるよう実装しようと思いました。
数が多かったのでマッピングを編集すればSingletonに登録するクラスが追加できるように実装してみました。
app/Providers/SingletonServiceClassRegisterProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class SingletonServiceClassRegisterProvider extends ServiceProvider
{
protected function singletonTargetServiceClassNamesMap():array
{
return [
\App\Service\PlanService::class,
];
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->registerAllClassInstanceInClassNamesMap($this->singletonTargetServiceClassNamesMap());
}
protected function registerAllClassInstanceInClassNamesMap(array $classNamesMap):void
{
foreach($classNamesMap as $key=>$className){
$instance = $this->app->make($className);
$this->app->instance(
is_numeric($key) ? $className : $key,
$instance
);
}
}
}
これで、マッピングにSignletonで登録したいクラスを追加、外したいクラスを削除することで管理できるサービスプロバイダになりました。
以上です。