Globální proměnná v modelu

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

Zdravím,

jak v modelu získám nějakou proměnnou, kterou jsem si nastavil v configu? V presenteru jsem se k ní dostal takto:

$this->context->parameter[mojePromenna]

což v modelu nelze, jak tedy nejlépe v modelu přistupovat do configu?

Díky

besanek
Člen | 128
+
0
-

Předej jí například v konstruktoru.

class Model {

	public function __construct($variable){
		...
	}
}

A pak jí tam vstříkni v configu.

services:
	model: Model(%mojePromenna%)
wb2009
Člen | 125
+
0
-

Díky, ale to můj problém neřeší, proměnných je více…
Resp. jo řeší, ale chtěl bych ty proměnné využívat i v presenteru,

Ideální řešení pro mne by bylo, jako mám teď this->context->parameter[promena] tak nějak přistoupit pro ní v modelu :)

Edit: něco mne ovšem napadlo,…vyzkouším…

Editoval wb2009 (2. 7. 2013 12:42)

Jiří Nápravník
Člen | 710
+
0
-

$this->context je bad practise…

Glottis
Člen | 129
+
0
-

vytahnuti ale nejakych parametru pres context v base presenteru kdyz to tam potrebuju snad zas takovy problem neni ne?

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected $settings;

    protected function startup() {
        $this->settings = $this->context->parameters['app'];
wb2009
Člen | 125
+
0
-

Glottis

asi tě nechápu, ale psal jsem, že v presenteru to problém není, ba to takhle i používám stejně jako ty.
Problém je, že to potřebuji vytáhnout i v modelu…

Edit:
Jiří Nápravník

když je to bad practise, tak nám napiš best practise, tohle mám hrozně moc rád, když někdo něco napíše, že je špatně, ale dobré řešení nenapíše…

Editoval wb2009 (2. 7. 2013 14:28)

vitkutny
Člen | 73
+
0
-

proč to neuděláš tak jak píše besanek? vždyť nemusíš předávat proměnou ale klidně celé pole proměnných

parameters:
	polePromennych:
		promena: 'a'
		dalsiPromena: 'b'

model pridat do services

services:
	model: Cesta\K\Modelu(%polePromennych%)

v modelu takto predas a v presenteru muzes udelat to stejne nebo i pres kontext

pubf __construct($polePromennych){
dump($polePromennych);
}

Editoval vitkutny (2. 7. 2013 14:28)

wb2009
Člen | 125
+
0
-

No moc se mi to nelíbí, ale asi to tak udělám, resp. nelíbí se mi, že budu předávat ještě něco jinýho než connection string, ale budiž…

vitkutny
Člen | 73
+
0
-

tam kde potřebuješ jen ten string, tak předej jen tu jednu proměnnou, v čem je problém?
Edit:
pokud ta jedna proměnná kterou potřebuješ je v tom poli proměných

services:
	model: Cesta\K\Modelu(%polePromennych.promenna%)

Editoval vitkutny (2. 7. 2013 14:36)

kuzma88
Člen | 15
+
0
-

Nic ti nebraní si udělat třídu

class FooBarSettings implements IFooBarSettings
{
    public function __construct($param1, $param2){
        ...
    }

    public function getParam1(){
      ...
    }

    public function getParam2(){
      ...
    }

    // atd.
}

nebo

class FooBarSettings implements IFooBarSettings
{
    public function setParam1($param1){
      ...
    }

    public function getParam1(){
      ...
    }

    public function getParam2(){
      ...
    }

    public function setParam2($param2){
      ...
    }

    // atd.
}
services:
    fooBarSettings: FooBarSettings (%mojePromenna%)

nebo

services:
    fooBarSettings:
		class: FooBarSettings
		setup:
			- setParam1(%mojePromenna%)
			- setParam2(%mojePromenna2%)

a pak můžeš to vstříknout jak do modelu, tak do presenteru. Nějaké nastavení by asi nebylo zas takové zlo, ale rozhodně bych takhle neschovával závislosti na nějaké jiné služby.

wb2009
Člen | 125
+
0
-

dobře, něco vyzkouším, díky za rady.

kuzma88
Člen | 15
+
0
-

wb2009 napsal(a):

Glottis

asi tě nechápu, ale psal jsem, že v presenteru to problém není, ba to takhle i používám stejně jako ty.
Problém je, že to potřebuji vytáhnout i v modelu…

Edit:
Jiří Nápravník

když je to bad practise, tak nám napiš best practise, tohle mám hrozně moc rád, když někdo něco napíše, že je špatně, ale dobré řešení nenapíše…

Obecně používaní $this->context (service locator) je problematické v tom, že nelze z API určit použité závislosti, jelikož přes context můžeš použít cokoliv co je v containeru a problematicky se na to pak píši testy.

wb2009
Člen | 125
+
0
-

pro mne, jakožto méně zkušeného nettaře, to zatím přes this->context->something plně postačí, ikdyž chápu, že v něčem to může být problematické a třeba na to v budoucnu narazím…

Jiří Nápravník
Člen | 710
+
0
-

Edit:
Jiří Nápravník

když je to bad practise, tak nám napiš best practise, tohle mám hrozně moc rád, když někdo něco napíše, že je špatně, ale dobré řešení nenapíše…

Tak snad nema smysl psat lepsi reseni a opakovat se, kdyz ti ho napsal besanek nade mnou, ze mas injectnout si promennou, pricemz ta promenna uz logicky muze byt jak primitivni datovy typ, tak pole, tak klidne trida (coz pisu i lide pode mnou)

wb2009
Člen | 125
+
0
-

Jiří Nápravník

O tom co je best practise jsi nenapsal v příspěvku ani slovo, takže děkuji za dodatečné vysvětlení.