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()