Práce se session v module nebo presenteru

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

Víceméně poprvé chci pracovat se SESSION v Nette aplikaci. Pokud se nepletu datová logika by měla být v Modelu. V návodu jsem se dočetl, že se session pracuji v presenteru pomocí $this->session. Jak ale s ní pracovat v modelu? Mělo by se se session pracovat v Modelu, nebo nikoliv? Mohl bych ho předávat v parametru z presenteru do modelu, ale to je hloupé, ne?
Díky za rady

duke
Člen | 650
+
0
-

Svou modelovou službu si zaregistruj do configu:

	services:
		someModel:
			class: Model\SomeModel

Do konstruktoru SomeModel si přidej parametr typu Nette\Http\Session, např.:

use Nette;

class SomeModel
{
	public function __construct(Nette\Http\Session $session)
	{
		...
	}
...

Když si pak necháš službu vytvořit z containeru (v presenteru se k němu dostaneš přes $this->context):

$someModel = $container->someModel;

… bude se ti díky autowiringu služba Session automaticky předávat do konstruktoru tvé třídy Model\SomeModel. Pokud bys nechtěl použít autowiring, můžeš v configu přímo uvést:

	services:
		someModel:
			class: Model\SomeModel(@session)

Edit: Změněno someModelService.

Editoval duke (26. 2. 2012 16:12)

aGr
Člen | 45
+
0
-

Nemělo by to být

$someModel = $container->someModelService;

neboť volám onu service? Když to tam nemám dostávám Service 'basketModel' not found. (pracuje konkrétně s modelem BasketModel). Nicméně i když tam připísnu „Service“ dostávám Argument 1 passed to Model\BasketModel::__construct() must be an instance of Nette\Http\Session, none given. Jak ty píšeš, že by se to mělo samo doplnit, tak na mě to křičí. Kde by mohla být chyba?

duke
Člen | 650
+
0
-

aGr napsal(a):

Nemělo by to být

$someModel = $container->someModelService;

Ano, moje chyba. Buďto takto, nebo lépe upravit config na:

services:
        someModel:
                class: Model\SomeModel

nebo jak jsem teď zjistil to lze ještě zjednodušit na

services:
        someModel: Model\SomeModel

aGr napsal(a):

Nicméně i když tam připísnu „Service“ dostávám Argument 1 passed to Model\BasketModel::__construct() must be an instance of Nette\Http\Session, none given. Jak ty píšeš, že by se to mělo samo doplnit, tak na mě to křičí. Kde by mohla být chyba?

Hmm, opravdu netuším. Zkusil jsem si to teď v Sandboxu a funguje mi to i s tím autowiringem.

Zkus promazat cache, znovu spustit a pokud ani to nepomůže, podívej se do vygenerovaného souboru v adresáři temp/cache/_Nette.Configurator. Hledej definici metody createServiceBasketModel. Měla by vypadat takto:

protected function createServiceBasketModel()
{
	$service = new Model\BasketModel($this->session);
	return $service;
}
Jan Endel
Člen | 1016
+
0
-

Jakou máš verzi Nette? Autowiring byl přidán teprve nedávno.

aGr
Člen | 45
+
0
-

pilec napsal(a):

Jakou máš verzi Nette? Autowiring byl přidán teprve nedávno.

2.0-dev released on 2011–07–02, bylo to tim diky.

Editoval aGr (28. 2. 2012 11:32)