Service ‚session‘ not found
- Woodfish
- Člen | 5
Dobrý večer, mám jeden takový určitě jednodušše odstranitelný
problém, ale já si s ním nevím rady.
Mám tenhle kód:
<?php
$container = new Nette\DI\Container;
$session = $container->getService('session'); // Na tomhle řádku to hlásí chybu
if( ! $session -> isStarted() ) $session -> start();
?>
Vypíše mi to Service ‚session‘ not found.
Tak nevím co dělám špatně…
Děkuji moc za rady
- Jan Voráček
- Člen | 90
@Woodfish: Napiš, kde přesně tenhle kód
používáš. Pokud je to nějaký presenter, je session service dostupná přes
$this->context->session
.
Jinak Nette\DI\Container
si představ opravdu jako
kontejner – co do něj nedáš, to tam není. A pokud si vytvoříš nový,
tak je logicky úplně prázdný.
- Woodfish
- Člen | 5
@Jan Voráček:V prezenteru to nepoužívám, jsem teprve lama v Nette, vpodstatě předchvílí jsem to začal užívat.
Mám teda další otázku, jak do kontejneru dostanu session? Udělal jsem tohle ale stejně to nefunguje (nevím jestli volám správnou metodu a jestli do toho dávám správně ty parametry)
$container = new Nette\DI\Container;
$container->addService('Ticket', 'session');
$session = $container->getService('session');
if( ! $session -> isStarted() ) $session -> start();
- studna
- Člen | 181
Kontejner = prázdný kontejner. Prostě nic, prázdný, žádná session. Předpokládám, že to máš v bootstrapu, jestli ne, tak je to stejně prasárna, přidávat služby po spuštění aplikace.
// toto zmiňoval pYro
$config = new Nette\Configurator();
// vrací DI\Container - ale už ne prázdný!
$container = $config->loadConfig( __DIR__ . '/config.neon' );
Editoval studna (29. 9. 2011 14:09)
- Vojtěch Dobeš
- Gold Partner | 1316
@fak: klidně používej Environment
, stále funguje :)
Ale DI
je tu s námi, abychom časem neměli
vážné problémy. A DI\Container
proto, aby to s
DI
bylo jednodušší. Pokud chceš k session v modelu (což je
předpokládám nějaká tvoje třída) přistoupit tak, abys zachoval
DI
, tak té třídě napiš takový konstruktor, který bude
vyžadovat instanci Nette\Http\Session
.
public function __construct(\Nette\Http\Session $session)
{
$this->session = $session;
}
A tam, kde danou třídu tvoříš jí předej
$container->session
.
$container = $configurator->loadConfig(NULL);
$model = new MyModel($container->session);
V prezenteru:
$model = new MyModel($this->context->session); // $this->context je ten $container výše, stejná instance
Efektně s využitím config.neon
:
common:
services:
model:
class: MyModel
arguments: [@session]
$model = $container->model;
V prezenteru:
$model = $this->context->model;
Výchozí služby jako session
dodává do systémového
kontejneru Nette\Configurator
, takže jak už bylo zmíněno
výše, nová instance Nette\DI\Container
žádné služby
neobsahuje.
Editoval vojtech.dobes (19. 10. 2011 21:29)
- fak
- Člen | 48
vojtech.dobes:
týjo, dobrý – díky, to vyzkouším.
v návodech o tomhle načítání není vůbec řeč, vždy je tam najednou
$container
a hotovo. A o $this->context
taky nic.
škoda že se to dozvídám na konci projektu. Teď už to nechám jak to mám, protože by mi to refaktorování na DI zabralo zase celý den.
Ještě jednou dík
jo a ten odkaz ti špatně odkazuje:(
Editoval fak (19. 10. 2011 16:00)
- Vojtěch Dobeš
- Gold Partner | 1316
fak: Díky za upozornění, opraveno. Jestli v projektu
nepoužíváte jednotkové testy (typicky PHPUnit
), tak ten
Environment
nevadí, ale jestli tam někdy testy budete dopisovat,
tak to bude pruda :). A jestli budete aplikaci rozšiřovat, tak budou chybět
testy… asi takto, tohle je vlastně celý ten příběh okolo
DI
.