storeRequest – Cannot send session cache limiter

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

Ahoj,
mám potíž s $application->storeRequest(). Používám tuto metodu v BasePresenteru, abych mohl vygenerovat backlink pro přihlašovací formulář, aby se pak mohl vrátit na stránku, ze které na něj uživatel přišel.

Aplikace normálně funguje, ale je problém s PHPUnitem.

1) Web_DefaultPresenterTest::testRun
InvalidStateException: Cannot send session cache limiter - headers already sent
(output started at C:\Program Files (x86)\Apache\php\PEAR\PHPUnit\Util\Printer.php:173)

D:\Webs\html\Trance\libs\Nette\Web\Session.php:115
D:\Webs\html\Trance\libs\Nette\Web\Session.php:345
D:\Webs\html\Trance\libs\Nette\Application\Application.php:333
D:\Webs\html\Trance\app\BasePresenter.php:137
D:\Webs\html\Trance\app\WebModule\presenters\DefaultPresenter.php:13
D:\Webs\html\Trance\libs\Nette\Application\Presenter.php:203
D:\Webs\html\Trance\tests\tests\Web_DefaultPresenterTest.php:10

Test vypadá jednoduše:

public function testRun() {
	$presenter = new Web_DefaultPresenter;

	$response = $presenter->run(new PresenterRequest('Web:Default', 'GET', array()));

	$this->assertType('RenderResponse', $response);
}

A v BasePresenteru řádek 137 vypadá takto (uvnitř metody beforeRender, ale nefungovalo to ani ve startupu):

$this->template->backlink = $this->application->storeRequest();

Mimochodem – jakým způsobem Nette zařizuje podobnou věc u formulářů s addProtection? Tam, pokud se nemýlím, taky zapisuje do session. A od doby, co existují továrničky, je možné, že se formulář bude vytvářet až v době, kdy už je něco vykreslené. Jak pak zapisuje do session?

Editoval Ondřej Mirtes (19. 11. 2009 9:46)

Honza Kuchař
Člen | 1662
+
0
-

A od doby, co existují továrničky, je možné, že se formulář bude vytvářet až v době, kdy už je něco vykreslené. Jak pak zapisuje do session?

Vyletí výjimka. Je doporučené si session nastartovat už v startapu.

Ondřej Mirtes
Člen | 1536
+
0
-

A to možná souvisí i s tím mým problémem s PHPUnitem, ne? Bohužel přesunutí startu session do bootstrapu to nevyřešilo :(

$session = Environment::getSession();
$session->setExpiration(Environment::getConfig('expiration')->userPermanent);
if (!$session->isStarted()) $session->start();