Wpis z mikrobloga

#symfony #php #pytanie

Jak poprawnie zrobić takiego:
Mam apkę która w zależności od kontekstu (np API, CLI, rodzaj usera zalogowanego) używa innego sposobu (tokena) autoryzacji dostępu do zasobów zewnętrznych.
Czasem token jest generowany przez klucz prywatny (BackendTokenService) a czasem przez SSO (SSOTokenService)

Np mam ExternalSearchService do wyszukiwania w zasobach zewnętrznych. Przez DI podaję BackendTokenService, który generuje token dla zapytania wyszukiwania.
No i to działa, ale chciałbym żeby ten kod był abstrakcyjny. Wymyśliłem że do serwisu wyszukiwania wstrzyknę interfejs zamiast klasy generującej token, ale gdzieś przecież musi być kod który decyduje którą konkretnie klasę do generowania tokenu użyć.

Gdzie ten kod powinienem umieścić? Może zamiast DI w kontrolerze jawnie utworzyć obiekt ExternalSearchService i (w zależności od kontekstu) jako argument użyć BackendTokenService lub SSOTokenService? To jakoś mi się nie podoba.

Da się jakoś to sensownie ogarnąć?
  • 4
@gajowy_marucha: co mi przychodzi na szybko to:
- serwis "fabryka" która będzie miała parametr iterator z wszystkimi token generatorami po interfejsie (!iterable po interfejsie w definicji serwisu)
- ładujesz ten serwis gdzie trzeba i wywołujesz get('nazwa') czy jaką tam metodę będziesz miał do pobierania konkretnej instancji danego generatora.
Wymyśliłem że do serwisu wyszukiwania wstrzyknę interfejs zamiast klasy generującej token, ale gdzieś przecież musi być kod który decyduje którą konkretnie klasę do generowania tokenu użyć.


@gajowy_marucha: faktorka