Volitelná část v adrese – jak zjednodušit router
- Ondris
- Člen | 37
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
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
Díky za odpověď.
- Foo parametry tu část url bohužel vyhodí. Potřebuji, aby mi tam to json nebo xml zůstalo.
- 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
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
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);