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
+
0
-

Ahoj,

měl bych pár otázek, na které nemohu najít odpověď:

  1. 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?
  2. Proč není obecně dobré pracovat přímo s DI kontejnerem?
  3. 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
+
0
-

Ahoj,

1)

-
	create: My\Message(%userId%)
	implement: My\MessageFactory
	parameters: [userId]
  1. 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.
  2. Velmi pohodlné je použití událostí a Kdyby/Events
Magnus
Člen | 65
+
0
-

Děkuji za odpověď.

  1. Jak budu poté v presenteru vytvářet instance? Jako druhý parametr by nejspíš měla dostat databázové spojení, které by se mělo předat automaticky.
David Matějka
Moderator | 6445
+
0
-

@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
+
0
-

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
+
0
-

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!