Předání parametrů továrně
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Magnus
- Člen | 65
Ahoj,
měl bych pár otázek, na které nemohu najít odpověď:
- Jak se v Nette 2.1 vytváří továrničky, které mají proměnlivý parametr? Dejme tomu, že bych měl třídu Message na zasílání a zobrazení zpráv. Chtěl bych jí předat ID uživatele – jak to vyřešit?
- Proč není obecně dobré pracovat přímo s DI kontejnerem?
- Jak zprovoznit komunikaci mezi modely navzájem? Např. když budu registrovat nového uživatele, tak aby metoda UserModel::register() automaticky zaslala E-mail, a nemusel jsem ji volat z presenteru.
Některé dotazy možná nejsou smyslupně vysvětlené, tak to když tak
zkusím více popsat.
Díky moc
- pave.kucera
- Člen | 122
Ahoj,
1)
-
create: My\Message(%userId%)
implement: My\MessageFactory
parameters: [userId]
- toho je víc. Schováváš tím závislosti, zbytečně toho předáváš moc… Okolo DI je spousta článků, trochu pohledej.
- Velmi pohodlné je použití událostí a Kdyby/Events
- David Matějka
- Moderator | 6445
@Magnus: injectnes si factory a parametr posles do create metody
class BarPresenter extends BasePresenter
{
/**
* @var \My\MessageFactory
* @inject
*/
public $messageFactory;
public function actionDefault()
{
$message = $this->messageFactory->create($this->user->id);
}
}
- Magnus
- Člen | 65
matej21 napsal(a):
@Magnus: injectnes si factory a parametr posles do create metody
class BarPresenter extends BasePresenter { /** * @var \My\MessageFactory * @inject */ public $messageFactory; public function actionDefault() { $message = $this->messageFactory->create($this->user->id); } }
Už je mi to snad jasné, díky moc.
- Magnus
- Člen | 65
Ahoj,
měl bych ještě jeden dotaz. Jelikož je k tématu, nechci kvůli tomu zakládat nové vlákno.
Potřeboval bych zprovoznit komunikaci mezi modely. Zatím jsem nezkoušel Kdyby – lze to vyřešit tak, že jedné továrně předám přes konstruktor instanci jiné továrny?
class PrvniFactory
{
private $db;
private $druhaFactory;
public function __construct(Nette\Database\Context $db, DruhaFactory $druhaFactory)
{
$this->db = $db;
$this->druhaFactory = $druhaFactory;
}
public function create($id)
{
return new PrvniModel($id, $this->db, $this->druhaFactory->create());
}
}
class DruhaFactory
{
private $db;
public function __construct(Nette\Database\Context $db)
{
$this->db = $db;
}
public function create()
{
return new DruhyModel($this->db);
}
}
class PrvniModel
{
private $id;
private $db;
private $druhyModel;
public function __construct($id, \Nette\Database\Context $db, DruhyModel $druhyModel)
{
$this->id = $id;
$this->db = $db;
$this->druhyModel = $druhyModel;
}
}
Po technické stránce to funguje. Jde mi o radu zkušenějších, zda je to
logicky správně a zda na to nemohu v nějakém případě doplatit.
Díky moc!