Laravel: различные реализации в экземпляре с Servcie Container - PullRequest
0 голосов
/ 29 марта 2019

В 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 с таким же набором параметров уже был создан,таким образом, не будучи одиночкой.

1 Ответ

1 голос
/ 29 марта 2019

Binding A Singleton

   $this->app->singleton('foo1', function ($app) {
     return new Foo(config('services.foo.apiKey1'));
   });

    $this->app->singleton('foo2', function ($app) {
        return new Foo(config('services.foo.apiKey2'));
     });

Вместо того, чтобы передавать класс Foo :: в первом параметре, передайте имя, которое вы будете использовать для разрешения создаваемого синглтона

Для разрешения сделайте следующее

//a new instance of Foo is created 
$foo1 = $this->app->make('foo1'); 

//the same instance created before is returned
$foo2 = $this->app->make('foo2');

Дайте мне знать, если я помог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...