Inject 3 modelů – vzájemné předání parametrů
- simPod
- Člen | 383
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
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
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)
- David Matějka
- Moderator | 6445
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
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
- to, ze data model pouziva nejaky utils, by melo byt presenteru uplne jedno. proste si v tom data modelu vyzadej utilsModel jako zavislost
- 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
- 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..
- David Matějka
- Moderator | 6445
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)