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;
}