RouterFactory::createRouter() cannot be called statically

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

Zdravím,

snažím se rozběhat jednoduché stránky postavené na sandboxu. Nette Requirements-Checker hlásil, že server má vše v pořádku (mimo Memcache extension a .htaccess mod_rewrite – mod_rewrite však funguje). Jakmile ale zapnu laděnku, zobrazí se tato chyba:

Non-static method RouterFactory::createRouter() cannot be called statically

// Create Dependency Injection container from config.neon file
$configurator->addConfig(dirname(__FILE__) . '/config/config.neon');
$configurator->addConfig(dirname(__FILE__) . '/config/config.local.neon', NConfigurator::NONE); // none section
$container = $configurator->createContainer(); //-> řádek 25 bootstrap.php hlásí error

Předpokládám, že Nette koliduje s nějakým nastavením serveru /na localhostu to totiž funguje bez problémů/. Neví někdo nějaký postup, jak bych tuto chybu mohl odstranit? Předem díky za všechny nápady.

Konfigurace:
PHP Version 5.2.11
Nette Framework 2.0.10 pro starší PHP 5.2 s prefixy

Filip Procházka
Moderator | 4668
+
0
-

Chyba se týká pouze a jenom třídy RouterFactory, viz

Non-static method RouterFactory::createRouter() cannot be called statically

Zkrátka ji špatně používáš. Bez screenu laděnky, konfigurace (té konkrétní služby) a kódu té třídy ti ale není pomoci :)

llsm
Člen | 121
+
0
-

Narazil jsem na tento problem nedavno take, kdyz jsem na PHP 5.2 stahl Nette pro PHP 5.2. Neresil jsem proc to tak je, jen jsem poslechl ladenku a stacilo z

<?php
public function createRouter()
?> v RouterFactory udelat
<?php
public static function createRouter()
?>

Někdo mě možná odsoudí, že jsem problém neřešil víc, ale měl jsem v plánu na projektu v blízké době přejít na php5.4 (což už se stalo) a nechtěl jsem se tím zdržovat…

Lojkac
Člen | 2
+
0
-

Jo, tohle násilné řešení funguje, mohlo mě napadnout udělat tuto metodu statickou (já jsem se zbytečně hrabal ve zdrojácích Nette). Jinak jsem ještě přišel na jiné řešení – spouštění Laděnky jiným způsobem, při tom se mi ale nezobrazovaly v debugbaru routy a myslím, že až bych začal pracovat s databázema, tak dotazy by taky nebyly vidět.

V defaultu se Laděnka v bootstrap.php spouští (takto ale házela chybu):
$configurator->setDebugMode(TRUE);
$configurator->enableDebugger(dirname(__FILE__) . '/../log');

Takto neházela chybu (nevím, jestli tento zápis není blbost):
NDebugger::enable(NDebugger::DEVELOPMENT);
$configurator->enableDebugger(dirname(__FILE__) . '/../log');

Zatím nechám metodu statickou, případně zauvažuji o změně hostingu. Díky moc.

Filip Procházka
Moderator | 4668
+
0
-

Ale vždyť ty jsi nám vůbec neukázal, jak to máš nakonfigurované…

Pokud chceš metodu statickou, tak takhle

services:
	router:
		create: RouterFactory::createRouter()

Pokud ji nechceš statickou, tak takhle

services:
	routerFactory: RouterFactory
	router: @routerFactory::createRouter()

S hostingem to nemá vůbec nic společného, dokonce ani s nastavením Tracy.

Tenhle řádek

$configurator->setDebugMode(TRUE);

bys měl vyhodit. Laděnka sama pozná, jestli jede z localhostu a zapne se. Potlačování chyb je nejkratší možná cesta do pekel. Laděnka by měla být zaplá vždy na maximální ukecanost a chyby bys měl řešit, né měnit nastavení debuggeru, dokud nezmizí!!

jsvelta
Člen | 39
+
0
-

Kde sa dajú v dokumentácii nájsť podrobnosti o tom rozdiele pri použití a nepoužití zavináča? Pred časom som riešil presne ten istý problém po stiahnutí sandboxu a vyriešil som to deklarovaním tej metódy ako static.

Rád by som sa ale dozvedel viac o roznych možnostiach konfigurácie DI kontajnera pomocou syntaxe neon.

Filip Procházka
Moderator | 4668
+
0
-

Třeba ti to bude jasnější, když to napíšu takhle

metoda

services:
    a: RouterFactory
    b: @a::createRouter()

Je v podstatě

$a = new RouterFactory();
$b = $a->createRouter();

a statická funkce

services:
    router:
        b: RouterFactory::createRouter()

je v podstatě

$b = RouterFactory::createRouter();

Jedno je název služby a jedno třída ;)

Newbiek
Člen | 12
+
0
-

Mám stejný problém, taktéž PHP 5.2

Tady je laděnka: http://fproject.9e.cz/error.html
Tady jsou kódy: https://gist.github.com/…3095e4d3266e

S Nette s namespace je to v pořádku, ale bez toho prostě nic.
Díky, za rady.