RouterFactory::createRouter() cannot be called statically
- Lojkac
- Člen | 2
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
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
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
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
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
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
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
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.