Co použít místo inject*()?
- Myiyk
- Člen | 321
Ahoj,
použil jsem inject*() a nestačil jsem se divit, co všechno to dělá.
- volá se vždy (i když se proměnná nepoužije, není lazy)
- volá se v pořadí odspodu nahoru, takže je úplně jedno jak se pojmenuje
- volá se rychleji než startup()
Což jsou dosti podstatné problémy.
V BasePresenter-u si chci injektnout třídu, která obaluje model, takže bych potom z presenteru volal
$this->model->category->metoda()
Má to ovšem háček, že já té třídě potřebuji předat ID jazyka,
který se používá.
A to právě není v inject*() možné, protože se volá ještě před
startup() a nemůžu tedy nastavit jazyk, protože ho ještě nevím.
Ideální by pro měl bylo použít:
getModel(Model $m) // předá třídu podle typehint
{
if(!$this->_model){
$m->setLang($this->langID);
$this->_model = $m;
}
return $this->_model;
}
Bylo by to lazy, takže by se ten model vytvořil až v momentě, kdybych potřeboval něco z DB.
Existuje něco takového ?
- Tomáš Jablonický
- Člen | 115
Tak si injectni továrničku a až budeš potřebovat „model“ tak si ho vytvoř:
<?php
protected $factory;
public function injectFactory($factory)
{
$this->factory = $factory;
}
public function actionDefault()
{
$model = $this->factory->create();
$mode->setLang($this->lang);
....
}
?>
Factory:
<?php
class Factory extend \Nette\Object
{
public function craete()
{
return new Model();
}
}
?>
Instance class factory bude existovat vždy (pokud je v neonu) a clas Model se vytvoří až teprve když to budeš potřebovat.
- David Matějka
- Moderator | 6445
pro lazy predavani zavislosti do presenteru muzes pouzit autowired z kdyby
ale to, ze se sluzba nepouzije, by se prilis stavat nemelo. pokud se ti do
presenteru injectuje hodne sluzeb, ktery pouzijes jen nekdy (treba v ruznych
akcich), je lepsi presenter rozdelit na mensi presentery :)
proc ten lang nenastavis ve startup? od toho prave startup je :)
- Tomáš Jablonický
- Člen | 115
<?php
protected $model;
public function injectModel($model)
{
$this->model = $model;
}
protected function startup()
{
parent::startup();
$this->model->setLang($this->lang);
}
?>
tohle nefunguje?
- Filip Procházka
- Moderator | 4668
Jazyk zjišťuj v routeru a při Application::onRequest
ho
nastavuj své překladové službě.