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!