Inject 3 modelů – vzájemné předání parametrů

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

Mám 3 modely [model1/2/3], které injectuji v presenteru.

/**
 * @inject
 * @var Model\Model1
 */
public $model1

/**
 * @inject
 * @var Model\Model2
 */
public $model2


/**
 * @inject
 * @var Model\Model3
 */
public $model3

Následně dělám:

public function startup() {
        parent::startup();
        $this->param = $this->model1->setParam($this->value);
    }

Teď potřebuji, aby model2 mohl volat metody v model3 a model3 zároveň znal $this->param, který nastaví model1 v Presenteru. Doufám že to dává trochu smysl, případně upřesním. Díky!

Tomáš Votruba
Moderator | 1114
+
0
-

Můžeš předat parametr oběma modelům?

public function startup() {
	parent::startup();
	$this->model1->setParam($this->value);
	$this->model3->setParam($this->value);
}
simPod
Člen | 383
+
0
-

no to bych teoreticky mohl a jak si pak sáhnu z model2 na model3? Já měl zatím jen řešení přes new Model3() v model2, ale to mi udělá novou instanci.

public function startup() {
    parent::startup();
    $this->model1->setParam($this->value);
    $this->model3->setParam($this->value);
    $this->model2->setModel($this->model3);
}

nejde to nějak elegantněji? nebo to je elegantní? :)

Editoval simPod (27. 12. 2013 19:16)

Jan Suchánek
Člen | 404
+
0
-

@simPod: Nesla by pouzit fasada?

David Matějka
Moderator | 6445
+
0
-

jo, fasada, jak radi jenicek muze byt dobrym resenim. napis, co presne ktery model je a co resi, pak se bude snadneji radit. pokud jsou jednotlive sluzby na sobe zavisle, proc si je proste nevyzadas jako zavislosti v tech konkretnich sluzbach?

simPod
Člen | 383
+
0
-

Jestli jsem z Googlu dobře pochopil co je fasáda, tak mi to asi nepřijde úplně vhodné (ale opravte mě…)

Dám modelům jména:

model1 - langModel
model2 - dataModel
model3 - utilsModel

langModel dostane hodnotu parametru $lang, na základě kterého vyhodnotí optimální jazyk a ten vrátí.

dataModel vrací různým presenterům data z databáze s tím, že takových modelů bude ve výsledku víc.

utilsModel dostane multilanguage data od dataModelu a na základě jazyku nastaveného langModelem je projede a dataModelu už vrátí data jen pro příslušný jazyk a dataModel data vrátí tam, kde se o ně požádalo.

Nějak takhle:

David Matějka
Moderator | 6445
+
0
-
  1. to, ze data model pouziva nejaky utils, by melo byt presenteru uplne jedno. proste si v tom data modelu vyzadej utilsModel jako zavislost
  2. dataModel muze byt na langModelu primo zavisly a pouze si z nej vytahnout vzdy prislusny jazyk, pripadne muzes ten jazyk vzdy posilat z presenteru do metody dataModelu – to je na tobe, jak se to vice hodi.. v pripade, ze dataModel je vic low-level (na urovni repository) bylo by vhodnejsi lang jako parametr, v pripade, ze je dataModel nejaka fasada, muzes si langModel vyzadat
  3. ten parametr $lang posilej pouze langModelu. lang model bude mit soucasne metodu „getLang()“, kterou budes volat bud z presenteru nebo primo z datamodelu (dle bodu #2) a muze ti byt uplne jedno, odkud ten lang ziskal..
simPod
Člen | 383
+
0
-

ok, mám pár dotazů:

  1. jak si vyžádám tu závislost? Pak by byla ještě otázka jak získá utilsModel $lang, ale to by asi vyřešila další závislost že?
  2. v dataModelu bych si chtěl ten langModel vyžádat, opět, jak?
  3. to zní dobře, ale zavisí na tom body 1) a 2)

Díky moc!

David Matějka
Moderator | 6445
+
0
-

ve sluzbach je nejlepsi vyzadovat zavislosti v konstruktoru

class DataModel extends Object
{
	protected $langModel;

	public function __construct(LangModel $langModel)
	{
		$this->langModel = $langModel;
	}
}

a kdyz budes mit vsechno spravne registrovane v neonu jako sluzby, nette se postara o autowiring

Editoval matej21 (27. 12. 2013 21:45)

simPod
Člen | 383
+
0
-

Aha! To jsem přesně sháněl ;) Díky!