Ajaxovy request s UUID v hlavicke – Chyba Nette\Application\BadRequestException: Action name is not alphanumer

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Chipso
Člen | 28
+
0
-

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
+
+1
-

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
+
0
-

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 prepisovat action znova na default

Editoval Chipso (18. 7. 2016 15:53)

duke
Člen | 650
+
+3
-

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
+
0
-

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
+
+1
-

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“.

CZechBoY
Člen | 3608
+
0
-

Co třeba něco ve stylu

$router[] = new Route('[<locale=en en|sk|cs>/]Organizations/Default/<uuid>', 'Organizations:Default:default');
Chipso
Člen | 28
+
0
-

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');

?>
Chipso
Člen | 28
+
0
-

CZechBoY napsal(a):

Co třeba něco ve stylu

$router[] = new Route('[<locale=en en|sk|cs>/]Organizations/Default/<uuid>', 'Organizations:Default:default');

Prave toto som nechcel, aby som pisal routu specialne pre organizacie. :) Snazil som sa o znovupouzitelnost