Service ‚session‘ not found

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

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

pYro
Člen | 29
+
0
-

IMHO sama od sebe se ti tam ta sluzba nedostane. Pouzij systemovy (vytvareny v configuratoru) kontejner ve kterem by uz mela byt.

Editoval pYro (29. 9. 2011 8:25)

Jan Voráček
Člen | 90
+
0
-

@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
+
0
-

@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
+
0
-

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)

fak
Člen | 48
+
0
-

studna: tohle mám praktikovat i v modelu, nebo jak tam můžu k session přistoupit?

ty kontejnery jsou pro mě dost nepochopitelný, předtím bylo Environment::getSession() o dost jednodušší..

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@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
+
0
-

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
+
0
-

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.