Správné předávání služeb do komponenty
- lunak83
- Člen | 47
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
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
Á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?)
- Filip Procházka
- Moderator | 4668
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í.