De juiste route vinden bij een router

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

01/09/2014 17:27:10
Quote Anchor link
Hallo,
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
 
PHP hulp

PHP hulp

29/03/2024 09:27:43
 
Ozzie PHP

Ozzie PHP

01/09/2014 17:32:15
Quote Anchor link
Quite simple... zorg dat een gebruiker niet "profile" kan kiezen als gebruikersnaam :)
 
Mark Hogeveen

Mark Hogeveen

01/09/2014 17:51:58
Quote Anchor link
Dus ook geen product dat "create" of "change" heet en geen email bevestigings-code in de url, die per toeval met de letters van een andere route begint. :p
Gewijzigd op 01/09/2014 17:52:28 door Mark Hogeveen
 
Ozzie PHP

Ozzie PHP

01/09/2014 17:58:13
Quote Anchor link
Dat lijkt me inderdaad zinvol :)

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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/09/2014 23:31:05
Quote Anchor link
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.

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.

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.
 
Mark Hogeveen

Mark Hogeveen

03/09/2014 21:25:59
Quote Anchor link
De problemen die eerder genoemd zijn in dit topic zijn eigenlijk niks. Het lukt mij nu niet om een goede afhandeling van het matchen van routes te bedenken. Heb al naar andere frameworks gekeken, om het voor mezelf simpel te houden heb ik naar CodeIgniter gekeken. Ik heb al veel codes gemaakt en tests gedaan, maar ik weet niet echt hoe ik het aanpak. Ik weet niks te bedenken om routes met variabelen te matchen.
Gewijzigd op 03/09/2014 21:27:14 door Mark Hogeveen
 
Ozzie PHP

Ozzie PHP

04/09/2014 00:27:32
Quote Anchor link
Ik heb ook een keer een router gemaakt, volgens mij op basis van de code van Pim in dit topic... als je dat even uitvogelt, dan denk ik dat je meteen een oplossing hebt die al jouw problemen oplost.

http://www.phphulp.nl/php/forum/topic/router/83492/
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.