Volba implementace sluzby na zaklade modulu ve kterem bude pouzita

- maio
 - Člen | 7
 
Nase aplikace (albumino.com) ma nekolik modulu. Potreboval bych ve dvou z nich pouzit sluzbu se stejnym jmenem, ale s rozdilnou implementaci danou tim, ktery modul zpracovava aktualni request. V jednom modulu ta sluzba odvede realnou praci a ve druhem to bude jen RPC.
Jde se v kontejneru dopracovat k aktualnimu requestu, pripadne jak ziskat modul abych mohl vytvoril factory, ktera vrati vhodnou impementaci?
PS: V budoucnu bych docela rad konfiguroval sluzby i na zaklade toho, kdo je prihlasen do aplikace.

- Filip Procházka
 - Moderator | 4668
 
class FooFactory extends Nette\Object
{
	private $application;
	private $user;
	private $db;
	public function __construct(
		Nette\Application\Application $app,
		Nette\Http\User $user,
		Nette\Database\Connection $db)
	{
		$this->application = $app;
		$this->user = $user;
		$this->db = $db;
	}
	public function create()
	{
		$requests = $this->application->getRequests();
		$lastRequest = end($requests);
		$presenter = $lastRequest->getPresenterName(); // vyparsuješ modul
		$module = magic($presenter);
		if ($module === 'Bar') {
			return new Bar($this->db);
		} elseif ($module === 'Foo') {
			return new Foo($this->db, $this->user);
		} elseif ($this->user->isInRole('admin')) {
			return new Lorem($this->db);
		}
		throw new Nette\InvalidStateException('Not sure what to do.');
	}
}
services:
	foo:
		factory: [FooFactory(), create]
Má to zásadní nevýhodu – když ti na to někdo sáhne, předtím než budeš znát request, nebo prostě v blbý moment, tak ti to můžeš vytvořit špatnou nebo žádnou službu.
Takže bych to raději používal tak, že budu mít pouze factory službu, kterou si vyžádám v presenteru/modelu a vždy vytvořím novou instanci.
services:
	fooFactory:
		class: FooFactory()