De juiste route vinden bij een router
Ik heb lang geleden een hele simpele router gemaakt. Je kon alleen routes maken met een vast pad.
Bijvoorbeeld:
product/settings
product/view
user/profile
Je kunt dus geen routes met variabelen maken. Zoals:
user/{username}
product/{product_id}
Ik wil dat nu ook gaan inbouwen in mijn routing systeem. Maar ik zit met een probleem.
Ik heb bijvoorbeeld 2 routes.
Een vaste route:
user/profile
en een met een variabele
user/{username}
Als ik bij die tweede route harry invul voor username, is het logisch dat je user/harry krijgt.
Maar wat als iemand als username "profile" heeft? Dan doet de router dus de vorige route matchen, tenzij de user/{username} eerder zou staan in de lijst met routes. Want de routes worden met een loop doorlopen, dus de eerste route die wordt gevonden, wordt gematcht.
Miscchien is dit niet echt een probleem, maar meer een foute keuze bij het verzinnen van de routes.
Nog een ander probleem (en deze is vervelender)
Ik heb wel eens gezien dat er routes waren met verplichte en niet-verplichte variabelen:
Bijvoorbeeld
product/{action}
product/{action}/{id}
action is altijd verplicht, id niet.
Hier moet dus niet de voorgaande route al gematcht worden, als de volgende route eigenlijk beter past. Als er geen id in de url staat, moet de eerste worden gematcht, als er wel een id staat moet de tweede worden gematcht.
Gewijzigd op 01/09/2014 17:31:54 door Mark Hogeveen
Quite simple... zorg dat een gebruiker niet "profile" kan kiezen als gebruikersnaam :)
Gewijzigd op 01/09/2014 17:52:28 door Mark Hogeveen
Je kunt natuurlijk ook je routes anders inrichten, dus niet:
www.mijnsite.nl/product/<naamvanproduct>
maar
www.mijnsite.nl/product/naam/<naamvanproduct>
Of
www.mijnsite.nl/product/<naamvanproduct>
maar dan
www.mijnsite.nl/product/edit/create
enz.
Harry hogeveen op 01/09/2014 17:27:10:
Een vaste route:
user/profile
en een met een variabele
user/{username}
Als ik bij die tweede route harry invul voor username, is het logisch dat je user/harry krijgt.
Maar wat als iemand als username "profile" heeft? Dan doet de router dus de vorige route matchen, tenzij de user/{username} eerder zou staan in de lijst met routes. Want de routes worden met een loop doorlopen, dus de eerste route die wordt gevonden, wordt gematcht.
Miscchien is dit niet echt een probleem, maar meer een foute keuze bij het verzinnen van de routes.
user/profile
en een met een variabele
user/{username}
Als ik bij die tweede route harry invul voor username, is het logisch dat je user/harry krijgt.
Maar wat als iemand als username "profile" heeft? Dan doet de router dus de vorige route matchen, tenzij de user/{username} eerder zou staan in de lijst met routes. Want de routes worden met een loop doorlopen, dus de eerste route die wordt gevonden, wordt gematcht.
Miscchien is dit niet echt een probleem, maar meer een foute keuze bij het verzinnen van de routes.
In Symfony is de volgorde van de opgegeven routes ook bepalend. De eerste match wordt uitgevoerd en dus moeten de statische routes voorgaan. Verder is het aan de programmeur/webdesigner om goede routes te kiezen. Immers de route user/{username}: wat doet die pagina? een profiel laten zien van een gebruiker? dan zou ik er van maken: user/{username}/profile of iets dergelijks om overlappingen van routes te voorkomen en een url een beetje te laten vertellen wat voor pagina je te zien zult krijgen.
Harry hogeveen op 01/09/2014 17:27:10:
Nog een ander probleem (en deze is vervelender)
Ik heb wel eens gezien dat er routes waren met verplichte en niet-verplichte variabelen:
Bijvoorbeeld
product/{action}
product/{action}/{id}
action is altijd verplicht, id niet.
Hier moet dus niet de voorgaande route al gematcht worden, als de volgende route eigenlijk beter past. Als er geen id in de url staat, moet de eerste worden gematcht, als er wel een id staat moet de tweede worden gematcht.
Ik heb wel eens gezien dat er routes waren met verplichte en niet-verplichte variabelen:
Bijvoorbeeld
product/{action}
product/{action}/{id}
action is altijd verplicht, id niet.
Hier moet dus niet de voorgaande route al gematcht worden, als de volgende route eigenlijk beter past. Als er geen id in de url staat, moet de eerste worden gematcht, als er wel een id staat moet de tweede worden gematcht.
ja dat kan toch? Je telt natuurlijk uit hoeveel delen de URI bestaat:
product/{action}: 2 delen, matcht dus ook alleen met ROUTES die uit twee delen bestaan.
product/{action}/{id}: 3 delen, matcht dus ook alleen met ROUTES die uit drie delen bestaan.
Gewijzigd op 03/09/2014 21:27:14 door Mark Hogeveen