Náhodné fungování routování
- prebijak
- Člen | 21
V aplikaci mi z ničeho nic přestanou fungovat routy (v odkazech je pouze # nebo error: No route for… po zapnutí debug módu), ale po chvíli už samy bez jakéhokoliv zásahu fungují. Chybu hlásí i jiní uživatelé aplikace.
Mám takovéto routy:
$container->router[] = new Route('index.php', 'Teams:default', Route::ONE_WAY);
$container->router[] = new Route('<lang ([a-z]{2})>/export.csv', 'Teams:export');
$container->router[] = new Route('<lang ([a-z]{2})>/seep[/<action>]', 'Seep:default');
$container->router[] = new Route('[!<lang ([a-z]{2})>[/<action>]]', 'Teams:default');
A na úvodní stránce jsou odkazy na Teams:register, Teams:list, Teams:edit, login a změnu parametru lang.
Aplikace běží tady: http://mcr2012.rogaining.cz
Mám minifikovanou verzi 2.0.3 released on 2012–04–04, konstanta NETTE_VERSION_ID je 20003. V logu nic není.
Zkoušel jsem hledat, ale možná jsem něco přehlédl.
Editoval prebijak (21. 5. 2012 18:39)
- prebijak
- Člen | 21
Zapnul jsem si debug bar a routy v něm vidím, ačkoliv odkazy hlásí, že
routy neexistují: http://mcr2012.rogaining.cz/default.png
Také když zadám adresu stránky manuálně, tak se zobrazí: http://mcr2012.rogaining.cz/list.png
- BigCharlie
- Člen | 283
nemůže být problém v parametru lang? Na tom prvním screenshotu máš lang NULL, přitom by asi měl být určen pro vytvoření odkazu.
Odhadoval bych, že ho nemáš persistentní. V té první routě by pak mělo být určení default jazyka. Nebo bys měl pro každý odkaz uvádět i jazyk, ne?
EDIT: ještě doplnění – to manuální zobrazení stránky funguje podle mě právě proto, že v adrese ten lang máš…
Editoval BigCharlie (28. 5. 2012 11:37)
- prebijak
- Člen | 21
Právě, že to persistentní mám – viz BasePresenter:
<?php
const DEFAULT_LANG = 'en';
/** @persistent */
public $lang;
protected function startup() {
parent::startup();
if(!isset($this->request->parameters['lang'])) {
$this->lang = $this->template->lang = $this->getHttpRequest()->detectLanguage(array('cs','en'))?:self::DEFAULT_LANG;
$this->canonicalize();
}
$this->context->translator->setLang($this->lang);
$this->template->setTranslator($this->context->translator);
}
?>
Zarážející na tom je, že to někdy funguje a někdy ne.
- BigCharlie
- Člen | 283
Proč je ve čtvrté routě ten vykřičník? Vyhoď čtvrtou routu a druhou zkopíruj tak, aby bylo možné využívat všechny akce. Pomůže?
- BigCharlie
- Člen | 283
Pořád se to točí okolo problému, že může nastat situace, kdy nemáš stanovený $lang. Tak ho, jak jsem už psal, definuj v routě defaultně. Ty routy by mohly vypadat takhle:
$container->router[] = new Route('index.php', array(
'presenter' => 'Teams',
'action' => 'default',
'lang' => 'cs',
), Route::ONE_WAY);
$container->router[] = new Route('<lang ([a-z]{2})>/export.csv', 'Teams:export');
$container->router[] = new Route('<lang ([a-z]{2})>/seep[/<action>]', 'Seep:default');
$container->router[] = new Route('<lang ([a-z]{2})>/<action>', 'Teams:default');
Změnilo se něco?
- Ot@s
- Backer | 476
BigCharlie napsal(a):
Změnilo se něco?
Myslím, že v tom problém nebude. Mám totiž podobný problém, tj. easy router:
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
Refrešováním neměnné URL ve tvaru a001/v001 stránka 7× naskočí a 1× ne (hláška ‚no route‘). Ty počty jsou samozřejmě náhodné. Obešel jsem to tak, že nepoužívám čísla v názvech presenterů a akcí. Až se budu nudit, tak se na to kouknu.
PHP 5.4.0
Apache/2.2.15 (CentOS)
Nette Framework 2.0.3 (revision eb558ae released on 2012–04–04)
Editoval Ot@s (5. 6. 2012 10:31)
- prebijak
- Člen | 21
@BigCharlie Právě že když není lang nastaven tak ho BasePresenter (viz #6) nastaví a pomocí kanonizace se upraví url tak aby tam byl (viz následující routu)
$container->router[] = new Route('[!<lang ([a-z]{2})>[/<action>]]', 'Teams:default');
Teda alespoň takhle to chápu.
Editoval prebijak (5. 6. 2012 21:42)