Správné předávání služeb do komponenty

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

Zdravím vás, vím že to tu už několikrát kolovalo, ale na základě pročtění diskusí v podobných tematech jsem stejně nedokázal situaci posoudit. V nette 2.0.8 používám např. služby modelu v komponentě. Ty v komponentě očekávám v konstruktoru. Nevím ale jestli to jak je tam předám je v pořádku.

Příklad 1 – session:

protected function createComponentOne() {
        $comp_one = new One($this->getSession('section'));
        return $comp_one;
}

Příklad 2 – model:
Model injectuji do presenteru do $this->model pomocí metody inject().

protected function createComponentTwo() {
        $comp_two = new Two($this->model);
        return $comp_two;
}

Je to takhle v pořádku, prosím? Díky.

Filip Procházka
Moderator | 4668
+
0
-

Cca takto

interface OneFactory { /** @return One */ function create (); }
interface TwoFactory { /** @return Two */ function create (); }
factories:
	one:
		class: One(@session::getSession(section))
		implement: OneFactory

	two:
		class: Two(@someModel)
		implement: TwoFactory
class MyPresenter extends BasePresenter
{
	private $oneFactory;

	public function injectOneFactory(OneFactory $oneFactory)
	{
		$this->oneFactory = $oneFactory;
	}

	protected function createComponentOne()
	{
		return $this->oneFactory->create();
	}
}
vvoody
Člen | 910
+
0
-

Áno, do určitej veľkosti/robustnosti aplikácie je takéto predávanie závislostí najvhodnejšie. Ak sa začne kopiť veľké množstvo závislostí pre komponenty v presenteri alebo (a súčasne) začneš vytvárať viacúrovňový strom komponent, čím budeš nútený predávať opakovane závislosť pre najhlbšiu komponentu cez všetky úrovne, je ten správny čas písať ku každej komponente továrničku (službu ktorá ju vytvorí a predá jej závislosti). Alebo si nechať vygenerovať továrničku na základe interface ako píše @Filip Procházka, len táto featura je myslím až v 2.1-dev (@HosipLan?)

lunak83
Člen | 47
+
0
-

Děkuji moc, pánové. U Filipovo řešení narážím na neznámé „implement“ v configu.

Filip Procházka
Moderator | 4668
+
0
-

Ano, bohužel. Pokud používáš stable, tak bys měl použít tuto techniku, k napodobení generovaných továrniček. To co jsem ukázal je možné pouze s vývojovou verzí.

lunak83
Člen | 47
+
0
-

Děkuji, updatoval jsem na 2.1dev, snad to nebude v projektu co už reálně běží ničemu vadit.