Volitelná část v adrese – jak zjednodušit router

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

Ahoj,

rád bych aby mi prošli tři adresy:
api/home/featured
api/json/home/featured
api/xml/home/featured

Pokud napíši routu:

$routeList = new RouteList('Api');
$routeList[] = new Route("api[/<json|xml>]/home/<action>", 'Home:default', $flags);

Tak mi vše funguje správně, ale chci mít samozřejmě pouze jednu routu pro všechny presentery, takže udělám úpravu:

$routeList = new RouteList('Api');
$routeList[] = new Route("api[/<json|xml>]/<presenter>/<action>", 'Home:default', $flags);

V tomto případě mi správně fungují adresy:
api/json/home/featured
api/xml/home/featured

ale adresa api/home/featured už mi vypisuje chybu Cannot load presenter ‚Api:Featured‘, class ‚ApiModule\FeaturedPresenter‘ was not found. Čili hledá to úplně něco jiného než chci. Přitom ta čáast json/xml by měla být volitelná.

pata.kusik111
Člen | 78
+
0
-

Neříkám, že jsem an toto expert, ale takhle z hlavy:

1. Foo parametry:

Route('api[/<? json?|xml|>]/<presenter>/<action>', 'Homepage:default');

2.

Route('api[/json|/xml]/<presenter>/<action>', 'Homepage:default');

ani jedno asi není finální řešení, ale myslím si, že to je ta cesta, kterou uvažovat.

Ondris
Člen | 37
+
0
-

Díky za odpověď.

  1. Foo parametry tu část url bohužel vyhodí. Potřebuji, aby mi tam to json nebo xml zůstalo.
  2. Situace se oproti mé routě obrátila. Funguje pouze adresa api/home/featured, zbylí dvě adresy routu nenajdou.

Nejzajímavější na tom je, že jde v zásadě o celkem banální problém. Přidání volitelné části adresy, což by se podle dokumentace mělo dělat pomocí [], teď jde jen o to přijít jak to přesně zapsat.

pata.kusik111
Člen | 78
+
0
-

Tak až zas tak banální problém to není, protože máš nepovinný parametr před povinným. A to se pak strojově jen velmi těžko řeší. Úplně odeální by bylo, kdybys to mohl mít obráceně, to jest na konci, něco jako:

Route('api/<presenter>/<action>[.<format>]', 'Homepage:default');

To jest povinné parametry první a poté teprve parametry nepovinné. Případně si na to napsat tu routu vlastní.

Jan Tvrdík
Nette guru | 2595
+
+3
-

Zkusil bych

new Route("api[/<format json|xml>]/<presenter>/<action>", 'Home:default', $flags);

nebo

new Route("api[!/<format json|xml>]/<presenter>/<action>", 'Home:default', $flags);
Ondris
Člen | 37
+
0
-

Díky, to je přesně to co jsem hledal.