Podmíněné načtení služby implementující stejné rozhraní

joe
Člen | 313
+
0
-

Ahoj, dostal jsem se do situace, kdy mám více služeb implementující stejné rozhraní a při nějaké podmínce potřebuji načíst první službu a jindy zase druhou službu (třeba když je přihlášený uživatel, potřebuji Service1 a když není, tak Service2). Stačí mi vždy jen jedna a nevím pořádně jak na to. Poradíte mi prosím jak na to? Děkuju

David Matějka
Moderator | 6445
+
+1
-

Pokud jsi schopný bezpečně na začátku requestu vyhodnotit, kterou službu potřebuješ (není to tedy závislé na nějakém mezistavu aplikace), tak si udělej další službu (resolver, případně by to taky mohla být factory, která se bude i starat o vytvoření těch služeb), která přijímá obě servicy a vrátí tu správnou, zhruba takhle

interface Foo {
	public function doSth();
}

class FooImplA implements Foo { ... }
class FooImplB implements Foo { ... }

class FooResolver {
	public function __construct(Foo $implA, Foo $implB) {}

	public function resolve(): Foo
	{
		return $sth ? $this->implA : $this->implB;
	}
}
services:
	fooA:
		class: FooImplA
		autowired: false
	fooB:
		class: FooImplB
		autowired: false
	fooResolver: FooResolver(@fooA, @fooB)
	- @fooResolver::resolve()
joe
Člen | 313
+
0
-

Dekuju moc, rikal jsem si, ze by to slo nejak podobne a ted otazka, jestli to tak je i bezne a neresi se to treba jinak koncepcne? Abych to vic priblizil, tak resim ukladani dat a pro neprihlasene uzivatele chci ukladat do sessions, pro prihlasene do databaze. A neprislo mi vhodne to mit v jedne tride.