В Laravel, как мне разрешить 2 разных одноэлементных реализации экземпляра, используя служебный контейнер Laravel (https://laravel.com/docs/5.7/container).
Например, у меня есть 2 реализации для класса Foo
:
$this->app->singleton(Foo::class, function ($app) {
return new Foo(config('services.foo.apiKey1'));
});
и
$this->app->singleton(Foo::class, function ($app) {
return new Foo(config('services.foo.apiKey2'));
});
Затем я должен также решить это как-то:
$fooV1 = app(Foo::class); // ?
$fooV2 = app(Foo::class); // ?
Как правильно написать и разрешить 2 разных реализации экземпляра синглтона?
Обновление
Я попробовал следующее решение:
$this->app->singleton(Foo::class, function ($app, $parameters) {
dump('Creating...'); // For testing only to see is actually a singleton
$apiKey = $parameters[0] ? config('services.foo.apiKey1') : config('services.foo.apiKey2');
return new Foo($apiKey);
});
, а затем разрешил его следующим образом:
$fooV1 = app(Foo::class, [true]);
$fooV2 = app(Foo::class, [false]);
Вышеприведенное также правильно выводит:
Creating...
Creating...
Так как это 2 разных синглета.
Это работает по большей части. Однако аспект синглтона не учитывается, т.е. при созданииодин и тот же foo дважды:
$aV1 = app(Foo::class, [true]);
$bV1 = app(Foo::class, [true]);
Выходы:
Creating...
Creating...
В этом случае он должен был выводить Created...
только один раз, поскольку Foo с таким же набором параметров уже был создан,таким образом, не будучи одиночкой.