Volba implementace sluzby na zaklade modulu ve kterem bude pouzita

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maio
Člen | 7
+
0
-

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
+
0
-
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()
maio
Člen | 7
+
0
-

Diky za rychlou a uzitecnou odpoved. Vcera jsem to v rychlosti naprasil tim, ze jsem v base tride daneho modulu nastavoval $this->context->parameters[„module“] = … :)

Kazdopadne tve reseni vypada podstatne lepe, takze si to pak jeste pozmenim.