Snaha o vytvoření routeru → Obejkt nenalezen
- B.Gen.Jack.O.Neill
- Člen | 8
Ahoj, tak nějak jsem se dostal k vytvoření vlastního routeru. Vždycky jsem to chtěl zkusit. Našel jsem si rozhraní, a rozpitval jsem si přepřipravené routery v Nette. Myslím že jsem z nich celkem pochopil jak napsat vlastní, myslím teoreticky :) Kdy vracet NULL, kam se odkazovat atd.
Problém je v tom, že jsem tak nějak myslel že když zadám adresu ve tvaru localhost/nette/něco/něco_dalšího dostanu se k ní přes $httpRequest->getUri(); metodu, a pak si budu moci rozparsovat a udělat co bude potřeba. Místo toho dostanu chybu objekt nenalezen. Pokud si ovšem vypíši jen můj přepřipravený alias v easyPhp (/nette), a v exception si vypíšu ibsah getUri(), laděnka mi krásně napíše http://127.0.0.1:8888/nette/
Chtěl bych se tedy zeptat, co mi uniká. Zdali je vůbec možné dostat se v routeru k celé url, respektive proč mi to jinak hází objekt nenalezen aniž bych vyvolal exception kterou mám kvůli vypsání proměnné natvrdo v Routu. Předpokládám že to nějak jde :) Děkuji moc :)
- Patrik Votoček
- Člen | 2221
jaký objekt nenalezen? kde? snippet kódu s X řádky kolem místa kde to spadne…
- Filip Procházka
- Moderator | 4668
Mám pocit, že by jsi si měl opravit mod_rewrite. Ale víc jsem z křišťálové koule nezjistil… měl bych ji už přeleštit, ale nějak se mi nechce… Nebo se dám na karty…
- B.Gen.Jack.O.Neill
- Člen | 8
Já vím, všichni jste na ty kódy :D Ne, teď vážně, sám vím že takhle něco řešit je těžký. Ale mě šlo spíše o jakousi radu, ve smyslu match fce. Nebojte, kod bude, jen mě nechte lépe vysvětlit oč mi jde :)
Myslel jsem, že fce match dostane za argument přes objekt $httpRequest celou cestu, kterou já v rámci Nette zadám do prohlížeče. Tedy řekněme že mám na localu adresář nette. V něm je nakopírovaný sandbox. Mám tedy cestu localhost/nette pro přístup na server. Myslel jsem, že obecně dostanu ve fci match z interface IRouter právě URL kterou zadám do prohlížeče. Tedy že například když někde zadá localhost/nette/clanek1/subclanek , budu si moci přes $httpRequest právě onu vytáhnout, a už nasměrovat na $presenterRequest jak se mi zlíbí.
Problém je v tom, že když zadám cestu v tomto tvaru, zobrazí se mi chybové hlášení „objekt nenalezen“, ne v rámci Laděnky. Prostě bílá stránka s textem Objekt nenalezen. Když ovšem zadám cestu ve tvaru localhost/nette , tedy pouze na adresář se skeletonem, pak v $httpRequest->getUri() dostanu onu cestu. Momentálně to mám takhle:
function match(Nette\Http\IRequest $httpRequest){
$path = $httpRequest->getUri();
throw new DibiException($path); //zde si vypisuji Laděnkou obsah cesty
Vím že DibiException je pro tohle mimo, ale potřebuju pouze výpis, a tohle byla první exception která mi v Laděnce vypíše string na kterou jsem si vzpoměl. Když zadám cestu localhost/nette, Laděnka mi vypíše v $path právě
http://127.0.0.1/nette
ale když zadám cokoliv jiného než vžše zmíněnou adresu zobrazí se místo Laděnky právě ona bílá stránka objekt nenalezen.
Asi jsem se někde zmýlil. Možná jsem tak úplně nepochopil jak router funguje. Hledal jsem tutoriály, bohužel jsem žádný vysvětlující toto nenašel. Jinak routování v rámci hotových routerů funguje jak má, tedy snad je server nsatvený dobře. Děkuji.
- Filip Procházka
- Moderator | 4668
public function match(Nette\Http\IRequest $httpRequest)
{
$uri = $httpRequest->getUri();
$path = $uri->getHost() . $uri->getPath();
dump($path); die();
jo a budu se opakovat… máš špatně nastavený mod_rewrite, což je modul apache, který se právě stará o zpracování cesty
/nejaka/tvoje/vymyslena-adresy
souborem
/index.php
Editoval HosipLan (18. 5. 2011 11:02)
- B.Gen.Jack.O.Neill
- Člen | 8
Ahoj, děkuju. Jenže problém je v tom, že opravdu nevím co je špatně. Tím myslím, když jsem začal s Nette, nefungovaly mi žádné, ani NRouter routy. Pak jsem povolil mod_rewrite, a nastavil ve všech konfiguračních souborech AllowOverride z None na All. Najednou už mi šly routy z NRouteru. Problém je že jen do doby než jsem chtěl použít filtry IN a OUT. Nejednou opět soubor nenalezen.
Používám EasyPHP 5.3.6 na Windows 7. Hledal jsem na Googlu snad celej den, ale prostě už nevím co víc nastavit. Nemáte s tím prosím zkušenosti? Popřípadě jiný balík podobný EasyPHP na Windows, se kterým vše funguje, jak má? Děkuji.
- Filip Procházka
- Moderator | 4668
pokud vidíš chybu prohlížeče, je problém na straně serveru
pokud vidíš nette chybu, nebo bílou obrazovku, je chyba v tvém scriptu a to
bys nám měl poslat nastavení rout a ten tvuj router, jestli chceš
poradit.
- B.Gen.Jack.O.Neill
- Člen | 8
Tak jsem přešel z EasyPHP na WAMP, a světe div se, funguje to. Všechno. Moc děkuji. Jestli se ještě mohu zeptat, v NPresenterRequest, první parametr předávaný konstruktoru $presenter, v jakém má být tvaru pro zavolání konkrétního renderu pro daný presenter? Například když jsem chtěl v NRouteru zavolat static.latte v adresáři Homepage, zadal jsem Homepage:static . Co mám zadat a v jakém tvaru do NPresenterRequest abych do se ním odkázal na výše zmíněné latte template? Není žádný kód k postnutí. Snažil jsem se to pochopit z kódu pro NRouter ale bezúspěšně. Děkuji.
Editoval B.Gen.Jack.O.Neill (18. 5. 2011 20:50)