Nette bez mod rewrite
- 22
- Člen | 1478
Měl bych takový obecný dotaz, jak funguje Nette v případě, že na
serveru není podpora mod_rewrite.
Pokud nepoužiji skeleton, a nenastvím routování v bootstrapu, tak Nette
defaultně hledá DefaultPreseneter. Vytvořím tedy DefaultPresenter+default
šablonu a vše funguje podle očekávání.
Ovšem, pokud použijí připravený skeleton a nechám povolené routování,
Nette očekává jako výchozí BasePresenter a výchozí pro ostaní
Presentery, navíc je abstraktní, což DefaultPresenter být nemůže, tedy
musel bych předřadit ještě jeden abstraktní Presenter za DefaultPresenter,
abych dodržel logiku skeletonu.
Pokud bych použil skeleton a vypnul routování, pak nefunguje správně
odkazování, protože jsou vytvářená hezká URL, která samozřejmě končí
chybou, pokud mode rewrite není povolen.
Čili jak z toho ven? Používat DefaultPresenter a další BasePresenter a pak rozvětvit web?
Editoval 22 (26. 1. 2010 15:28)
- Ondřej Brejla
- Člen | 746
Dej SimpleRouter
jako poslední routu? Pokud nevyhoví žádná
před ním, použije se simple…
- 22
- Člen | 1478
simple routa mi háže chybu :-(
BadRequestException #404
Presenter name must be alphanumeric string, '' is invalid.
bootstrap.pbp
//Nastavení
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
//Nastavení routeru
$router = $application->getRouter();
/*
$router[] = new Route('index.php', array(
'presenter' => 'HomePage',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'HomePage',
'action' => 'default',
'id' => NULL,
));
*/
$router[] = new SimpleRouter('index.php', array(
'presenter' => 'HomePage',
'action' => 'default',
), Route::ONE_WAY);
$router[] = new SimpleRouter('<presenter>/<action>/<id>', array(
'presenter' => 'HomePage',
'action' => 'default',
'id' => NULL,
));
- Panda
- Člen | 569
Nejde míchat oba druhy routování, protože pokud bude mod_rewrite
zakázán, tak ty „běžné“ routy vyhoví a použijí se (problém je
hlavně ve vytváření odkazů) – k SimpleRouter
u se to ani
nedostane. A zase opačně – kdyby byl SimpleRouter
první, tak
vyhoví a k těm dalším se to nedostane.
- Honza Marek
- Člen | 1664
Ondřej Brejla napsal(a):
Dej
SimpleRouter
jako poslední routu? Pokud nevyhoví žádná před ním, použije se simple…
To určitě ne. Odkazy se pak budou generovat stejně na první routy.
Spíš bych zkusil něco takového:
if (in_array("mod_rewrite", apache_get_modules())) {
// nastavit normální routy
} else {
// nastavit simplerouter
}
- 22
- Člen | 1478
Honza Marek napsal(a):
Ondřej Brejla napsal(a):
Dej
SimpleRouter
jako poslední routu? Pokud nevyhoví žádná před ním, použije se simple…To určitě ne. Odkazy se pak budou generovat stejně na první routy.
Spíš bych zkusil něco takového:
if (in_array("mod_rewrite", apache_get_modules())) { // nastavit normální routy } else { // nastavit simplerouter }
nebylo by dobré tohle dát přímo do skeletonu tedy?
- Ondřej Brejla
- Člen | 746
Jistěže píšu bláboly…ale než to stačím opravit, tak jsou tu další odpovědi. Naštěstí. Jdu se projít…nepřemýšlím…
- Panda
- Člen | 569
22 napsal(a):
nebylo by dobré tohle dát přímo do skeletonu tedy?
To by nebylo asi nejlepší: https://forum.nette.org/…-mod-rewrite.
Jinak je to SimpleRouter
, ne SimpleRoute
, takže
použití je trochu jiné:
$application->setRouter(new SimpleRouter());
Samožřejmě lepší je řešit to přes service…
- 22
- Člen | 1478
Proč Laděnka v Nette Apllication vypisuje misto index.php
ndex.php
?
array(1) ▼ {
0 => object(PresenterRequest) (7) ▼ {
"method" private => string(3) "GET"
"flags" private => array(1) ▼ {
"secured" => bool(FALSE)
}
"name" private => string(0) ""
"params" private => array(1) ▼ {
"action" => string(8) "ndex.php"
}
"post" private => array(0)
"files" private => array(0)
"frozen" private => bool(FALSE)
}
}
- Honza Marek
- Člen | 1664
22 napsal(a):
nebylo by dobré tohle dát přímo do skeletonu tedy?
Kdysi to tam bylo, ale skeleton pak prošel zjednodušením. Ono nepřítomnost rewritu na hostingu asi nebude moc častá situace. Hlavně ten můj způsob ale funguje jen pod apache, což není jediný webserver na světě :)
- 22
- Člen | 1478
Tady je bootstrap se Simple route, háže chybu:
Presenter name must be alphanumeric string, '' is invalid.
<?php
//Zavoláme si framework
require LIBS_DIR . '/Nette/loader.php';
//a pustíme si debuggovací službu - známou jako Ladenka
Debug::enable();
//Náhrání konfigurace
Environment::loadConfig();
//Nastavení
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
//Nastavení routeru
$router = $application->getRouter();
$router[] = new SimpleRouter('index.php', array(
'presenter' => 'HomePage',
'action' => 'default',
));
//Start aplikace
$application->run();
…není mi jasný, kde je chyba, asi se půjdu taky projít :-(
- Honza Marek
- Člen | 1664
Panda: Celý Simple lze použít i jako jednu z rout v multirouteru.
Editoval Honza Marek (26. 1. 2010 17:51)
- 22
- Člen | 1478
Honza Marek napsal(a):
22 napsal(a):
nebylo by dobré tohle dát přímo do skeletonu tedy?
Kdysi to tam bylo, ale skeleton pak prošel zjednodušením. Ono nepřítomnost rewritu na hostingu asi nebude moc častá situace. Hlavně ten můj způsob ale funguje jen pod apache, což není jediný webserver na světě :)
Problém je v tom, že pokud někdo mod_rewrite nemá a chce testovat Nette, použije skeleton + nějaký návody tady, kde se automaticky předpokládá mod rewrite on, dostane se do potíží..
- Honza Marek
- Člen | 1664
22 napsal(a):
…není mi jasný, kde je chyba, asi se půjdu taky projít :-(
Podle API to nevypadá, že by SimpleRouter přijímal jako první parametr jméno souboru. Možná je špatná dokumentace.
- 22
- Člen | 1478
pak dostavam tuto chybu:
Cannot use object of type SimpleRouter as array
zajímavý je, že ten původní bootstrap o pár příspěvků výše,
jeden na venkovní adrese, akora nenačte patřičný layout a hlásí 404,
pokud to spustím na lokalni siti,
vyhlasí: Presenter name must be alphanumeric string, '' is invalid.
- Panda
- Člen | 569
Prosím celou výjimku, abych viděl, kde přesně k tomu dochází. Tipuji, že nastavíš ten router a pak se do něj snažíš ještě cpát další routy ve stylu
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'HomePage',
'action' => 'default',
'id' => NULL,
));
Jinak rozdílné chování podle adresy sice zajímavé je, ale jedná se o jednu z těch „killer features“ Nette – nastavení aplikace podle prostředí ve kterém se nachází. LAN autmaticky zapíná vývojové prostředí, venkovním uživatelům to chyby přece nebude vypisovat. Viz https://doc.nette.org/cs/configuring.
Honza Marek napsal(a):
Panda: Celý Simple lze použít i jako jednu z rout v multirouteru.
Jasně, i MultiRouter
y jdou zanořovat, když to všechno
sdílí rozhraní IRouter
… Ale má to smysl takto uvádět, když
to stejně nejde moc kombinovat? Neudělalo by to začátečníkovi ještě
o trošku větší guláš, kdyby to dělalo neplechu?
- Ondřej Mirtes
- Člen | 1536
Mně tedy funguje řešení:
$router[] = new SimpleRouter(array(
'module' => 'Web',
'presenter' => 'Homepage',
'action' => 'default',
));
Pokud použiju variantu se setRouter, Laděnka zahlásí:
Service named 'Nette\Application\IRouter' has been already registered.
Jinak je jasné, že SimpleRouter má jiné parametry konstruktoru, stačí použít hlavu (a pokud selže, tak API).