storeRequest – Cannot send session cache limiter
- Ondřej Mirtes
- Člen | 1536
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
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
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();