Práce se session v module nebo presenteru

- aGr
- Člen | 45
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
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
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
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;
}