Ajaxovy request s UUID v hlavicke – Chyba Nette\Application\BadRequestException: Action name is not alphanumer
- Chipso
- Člen | 28
Dobry den,
Chcel by som sa opytat, preco mi Nette aplikacia vyhadzuje chybu. (Pouzivam PostgreSQL a UUID ako primarny kluc pre databazu)
Nette\Application\BadRequestException: Action name is not alphanumeric string
Ked posielam ajaxovy (aj normalny) request.
Request posielam na adresu:
http://dobravec.dev/sk/organizations/default/b2c92799-d9d5-4347-b656-c6bcf18258e6?do=like
Ked ale zmenim vyhladavaci kluc (napriklad ICO organizacie) tak to funguje v pohode
http://dobravec.dev/sk/organizations/default/23772131?do=like
Vie mi niekto poradit, co robim zle ? resp. co by som mal urobit, aby sa mi nevyskytovala takato chyba ? (Takato chyba sa ale vyskytuje iba pri niektorych UUID)
Router mam definovany ako:
<?php
$router[] = new Route('[<locale=en en|sk|cs>/]<module>[/<presenter>]/<action>[/<uuid>]', 'Default:default');
?>
Ked ale definujem router ako
<?php
$router[] = new Route('[<locale=en en|sk|cs>/]<module>[/<presenter>]/<action>', 'Default:default');
?>
Tak to funguje normalne
Editoval Chipso (18. 7. 2016 15:28)
- Jan Endel
- Člen | 1016
Toto jsme nedávno taky řešili, Nette používá pomlčky jako rozdělovník pro komponentový strom. Po několikerým přemýšlení, jak to vyřešit co nejelegantněji jsme se vrátili k úplně původnímu nápadu a nahradili jsme pomlčky podtržítkama a pak zase zpátky.
To co na to hledáš, jsou globální filtry v routování: https://doc.nette.org/…tion/routing#…
- Chipso
- Člen | 28
Jan Endel napsal(a):
Toto jsme nedávno taky řešili, Nette používá pomlčky jako rozdělovník pro komponentový strom. Po několikerým přemýšlení, jak to vyřešit co nejelegantněji jsme se vrátili k úplně původnímu nápadu a nahradili jsme pomlčky podtržítkama a pak zase zpátky.
To co na to hledáš, jsou globální filtry v routování: https://doc.nette.org/…tion/routing#…
Dakujem, no aj po vypisani tohto pola mi to vypise pri
FILTER_IN
:
Array ( [locale] => sk [module] => Organizations [presenter] => Default [action] => b2c92799D9d5-4347B656C6bcf18258e6 [uuid] => [do] => like ) Array ( [locale] => sk [module] => Organizations [presenter] => Default [action] => b2c92799D9d5-4347B656C6bcf18258e6 [uuid] => [do] => like )
- Cize teraz navrhujes, ze mam do tohto associativneho pola napchat moje
preparsovane UUID ako
$params['uuid']
? - Pride mi to ako krkolomne riesenie parsovat string
b2c92799D9d5-4347B656C6bcf18258e6
znova na$uuid
a prepisovataction
znova nadefault
Editoval Chipso (18. 7. 2016 15:53)
- duke
- Člen | 650
Jde o to, že ta routa je nejednoznačná a nepovinný parametr
<presenter>
má přednost před nepovinným parametrem
<uuid>
(nejspíš protože je uveden první).
To, že se to chová různě pro různé hodnoty parametrů je dáno tím,
že parametr <action>
pojme pouze hodnoty začínající
znakem a-z (regulár je: [a-z][a-z0-9-]*
, jak je definováno zde).
Hodnota b2c92799-d9d5–4347-b656-c6bcf18258e6 začíná znakem a-z a může
jít tedy o parametr <action>
, pročež se
<presenter>
nastaví na uvedenou hodnotu default,
<action>
na uvedenou hodnotu
b2c92799-d9d5–4347-b656-c6bcf18258e6 a <uuid>
na prázdnou
hodnotu.
Hodnota 23772131 znakem a-z nezačíná a nemůže jít tedy o hodnotu
parametru <action>
, pročež se <presenter> nastaví na
výchozí hodnotu default, <action>
na uvedenou hodnotu
default a <uuid>
na hodnotu 23772131.
Editoval duke (18. 7. 2016 16:50)
- Chipso
- Člen | 28
duke napsal(a):
Jde o to, že ta routa je nejednoznačná a nepovinný parametr
<presenter>
má přednost před nepovinným parametrem<uuid>
(nejspíš protože je uveden první).To, že se to chová různě pro různé hodnoty parametrů je dáno tím, že parametr
<action>
pojme pouze hodnoty začínající znakem a-z (regulár je:[a-z][a-z0-9-]*
, jak je definováno zde).Hodnota b2c92799-d9d5–4347-b656-c6bcf18258e6 začíná znakem a-z a může jít tedy o parametr
<action>
, pročež se<presenter>
nastaví na uvedenou hodnotu default,<action>
na uvedenou hodnotu b2c92799-d9d5–4347-b656-c6bcf18258e6 a<uuid>
na prázdnou hodnotu.Hodnota 23772131 znakem a-z nezačíná a nemůže jít tedy o hodnotu parametru
<action>
, pročež se <presenter> nastaví na výchozí hodnotu default,<action>
na uvedenou hodnotu default a<uuid>
na hodnotu 23772131.
napada ti nejake plnohodnotne riesene bez hackovania ? Kedze uz do Globalneho filtra sa mi dostane zla hodnota.
Editoval Chipso (18. 7. 2016 17:30)
- duke
- Člen | 650
Mohlo by stačit udělat parametr presenter povinným (tj. odstranit hranaté závorky). Akorát se ti potom v url bude objevovat 2× default (jednou pro presenter a jednou pro action).
Pokud trváš na nepovinnosti parametru presenter (případně i action), nezbyde ti, než jednoznačnost routy zajistit jinak – např. pomocí nějakých prefixů, či postfixů. Např. pro uuid používat [/uuid-<uuid>] nebo možná i [/uuid/<uuid>] a pak pro parametry presenter a action nastavit reguláry, které nebudou přijímat nic, co začíná na „uuid“.
- Chipso
- Člen | 28
duke napsal(a):
Mohlo by stačit udělat parametr presenter povinným (tj. odstranit hranaté závorky). Akorát se ti potom v url bude objevovat 2× default (jednou pro presenter a jednou pro action).
Pokud trváš na nepovinnosti parametru presenter (případně i action), nezbyde ti, než jednoznačnost routy zajistit jinak – např. pomocí nějakých prefixů, či postfixů. Např. pro uuid používat [/uuid-<uuid>] nebo možná i [/uuid/<uuid>] a pak pro parametry presenter a action nastavit reguláry, které nebudou přijímat nic, co začíná na „uuid“.
Dakujem za radu, vyriesil som to takto:
<?php
$router[] = new Route('[<locale=en en|sk|cs>/]<module>[/<presenter>]/<action>[/uuid/<uuid [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}>]', 'Default:default');
?>