Migrace na NETTE 2.1 problém se SESSION

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

Dobrý den,
snažím se můj projekt updatovat na NETTE 2.1, ale nemůžu zjistit proč se mi stále vyhazuje následující chybka:

Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.

126:    // Configure and run the application!
127:    $container->application->run();

Bootstrap.php vypadá následovně

use Nette\Application\Routers\Route;


// Load Nette Framework
require LIBS_DIR . '/autoload.php';

// Configure application
$configurator = new Nette\Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setDebugMode($configurator::DEVELOPMENT);
//$configurator->setDebugMode(TRUE);
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
//	->addDirectory(__DIR__ . '/../libs/DoctrineExtensions')
//	->addDirectory(__DIR__ . '/../libs/SessionPanel')
//	->addDirectory(__DIR__ . '/../libs/grido')
//	->addDirectory(__DIR__ . '/../libs/Helpers')
//	->addDirectory(__DIR__ . '/../libs/Facebook')
//	->addDirectory(__DIR__ . '/../libs/Symfony')
	->addDirectory(APP_DIR)
	->register();

//Kdyby\Extension\Diagnostics\HtmlValidator\DI\ValidatorExtension::register($configurator);
//Kdyby\SessionPanel\DI\SessionPanelExtension::register($configurator);
//\Nella\Console\Config\Extension::register($configurator);
//\Nella\Doctrine\Config\Extension::register($configurator);
//\Nella\Doctrine\Config\MigrationsExtension::register($configurator);
//Kdyby\Translation\DI\TranslationExtension::register($configurator);


// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');

$container = $configurator->createContainer();

Config.neon

common:
	parameters:
		database:
			driver: pdo_mysql
			host: localhost
			dbname: test
			user:
			password:
			charset: utf8
			collation: utf8_czech_ci
		session:
			autoStart: true  # výchozí je smart
			expiration: "+ 10 days"
		facebook:
			appId: 'xxxxx' # musi byt string
			secret: 'xxxx'

	translation:
		default: cs
		fallback: [cs_CZ, cs, en, en_US, en_GB]
		whitelist: ['cs', 'en']

	php:
		date.timezone: Europe/Prague
		session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes

	nette:
		session:
			autoStart: smart
		debugger:
			strictMode: true
			bar:

	doctrine:
		connection: %database%
		console: true

	migrations:
		connection: @doctrine.connection

	services:
		database: @doctrine.entityManager

		authenticator: Authenticator( @database::getRepository('User'), @database )

		facebook: Facebook( {appId: %facebook.appId%, secret: %facebook.secret%} )
		facebookAuthenticator: FacebookAuthenticator( @database::getRepository('User') )

index.php

// uploadify session problem

if (isset($_REQUEST[session_name()])) {

	$_COOKIE[session_name()] = $_REQUEST[session_name()];

}

// absolute filesystem path to the web root

define('WWW_DIR', __DIR__);

// absolute filesystem path to the application root

define('APP_DIR', WWW_DIR . '/app');

// absolute filesystem path to the libraries

define('LIBS_DIR', WWW_DIR . '/libs');

// absolute filesystem path to the temporary files

define('TEMP_DIR', WWW_DIR . '/temp');

// load bootstrap file


require APP_DIR . '/bootstrap.php';

EDIT:
Zjistil jsem že to dělá tenhle doplněk:

\Nella\Console\Config\Extension::register($configurator);

Upravoval jsem tam jednu metodu kvůli tomu že byla odstraněna property classess z containeru.
Jedná se o soubor: LazyRouter.php

Vyhodí to chybku: Illegal offset type in isset or empty
Na řádku: ..\pcms\libs\nette\nette\Nette\DI\Container.php:115

Aktuálně vypadá takhle:

class LazyRouter extends Router
{


	/**
	 * @param \Nette\DI\Container
	 */
	public function __construct(\Nette\DI\Container $container, $serviceName = NULL)
	{

		if (!$serviceName) {
			$class = 'Symfony\Component\Console\Application';
			$lower = ltrim(strtolower($class), '\\');

	         $names = $container->findByType($class);
	         \Nette\Diagnostics\Debugger::dump($names);

	         //exit;
	         if (!$names) {
	                 throw new MissingServiceException("Service of type $class not found.");
	         } elseif (count($names) > 1) {
	             throw new MissingServiceException("Multiple services of type $class found: " . implode(', ', $names) . '.');
	         } else {
	             $serviceName = $container->getService($names[0]);
	         }
		}

		if (!$container->hasService("console.application")) {
			throw new \Nette\DI\MissingServiceException("Service '$serviceName' not found.");
			//exit;
		}
		//exit;

		$this->callback = callback(function () use ($container, $serviceName) {
			$console = $container->getService($serviceName);
			 \Nette\Diagnostics\Debugger::dump($console);

			$console->run();
		});
	}




}

Pak tu mám ještě nějaké info:

/--php
804:        /**
805:         * @return Nette\Application\Routers\RouteList
806:         */
807:        public function createServiceRouter()
808:        {
809:            $service = new Nette\Application\Routers\RouteList;
810:            $service->offsetSet(NULL, $this->getService(**'console.route'**));
811:            return $service;
812:        }

\--

Pokud by někdo věděl v čem je problém, budu mu velmi vděčný!
Děkuji !

Editoval Klainer (19. 1. 2014 16:11)

Jan Tvrdík
Nette guru | 2595
+
-1
-

Které části té chybové hlášky nerozumíš?

Klainer
Člen | 42
+
0
-

Nepochopil jsem ji celkově.
Ale vyřešil jsem to tím, že jsem si nainstaloval kdyby Consoly která je funkční pro nové nette.
Nicméně kdyby jsi byl tak hodný, mohl bys mě říct co jsem tam dělal špatně ?

Já to chápu tak, že jsem se pokoušel přistupovat k poli pomocí obejktu nebo pole jako klíčový parametr..
Jako parametr jsem ale posílal string..

Děkuji

enumag
Člen | 2118
+
0
-

Myslím, že Honza měl na mysli tu první hlášku „Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.“.

Klainer
Člen | 42
+
+1
-

Ještě bych se k tomu vrátil, nestal mi znovu tento problém se session, při odeslání formulře, dle chybové hlášky jsem zkusil ouputdebuger, ale nějak nevím jak detekovat kde je vlastně samotný problém nebo, příčina, abych tuhle věc mohl opravit…

Výpis output debuggeru:

Output started here:<br />
#0 C:\xampp\htdocs\pcms\temp\cache\_Nette.FileTemplate\_Templates._layout.latte-51f201e23d1add8099ad23d56ef6b442.php(48): {closure}('<!DOCTYPE html>...', 3)<br />
#1 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Utils\LimitedScope.php(65): include('C:\xampp\htdocs...')<br />
#2 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Templating\FileTemplate.php(108): Nette\Utils\LimitedScope::load('C:\xampp\htdocs...', Array)<br />
#3 C:\xampp\htdocs\pcms\temp\cache\_Nette.FileTemplate\_Page.editPage.latte-1f3a78253b5d3d6c6ce634e8ce976d0a.php(93): Nette\Templating\FileTemplate->render()<br />
#4 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Utils\LimitedScope.php(65): include('C:\xampp\htdocs...')<br />
#5 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Templating\FileTemplate.php(108): Nette\Utils\LimitedScope::load('C:\xampp\htdocs...', Array)<br />
#6 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Application\Responses\TextResponse.php(51): Nette\Templating\FileTemplate->render()<br />
#7 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Application\Application.php(152): Nette\Application\Responses\TextResponse->send(Object(Nette\Http\Request), Object(Nette\Http\Response))<br />
#8 C:\xampp\htdocs\pcms\libs\nette\nette\Nette\Application\Application.php(85): Nette\Application\Application->processRequest(Object(Nette\Application\Request))<br />
#9 C:\xampp\htdocs\pcms\app\bootstrap.php(134): Nette\Application\Application->run()<br />
#10 C:\xampp\htdocs\pcms\index.php(47): require('C:\xampp\htdocs...')<br />
#11 {main}

Vyřešeno: V komponěntě formuláře jsem měl při zpracování redirect a měl jsem tam kod na debugování (dump)

	public function editPageStructureSubmitted(Form $form)
	{
 		$data = $form->getValues();
 		$post = $this->getRequest()->getPost();
 		$params = $this->getRequest()->getParameters();

 		\Nette\Diagnostics\Debugger::dump($params); <----- Toto mu vadilo

Editoval Klainer (27. 1. 2014 13:09)

Robyer
Člen | 74
+
0
-

Jen tak mimochodem – šikovnější je dumpovat si proměnné přímo do debugbaru metodou barDump()

sKopheK
Člen | 207
+
0
-

Mě tahle hláška čas od času vyskočí, když se někde objeví chyba, která by se normálně měla vypsat v Laděnce. Od té doby se jí nemůžu zbavit, dokud nesmažu, co se dá.

Editoval sKopheK (23. 4. 2014 9:53)