frontcontroller
Ik vroeg me af hoe ik met frontcontroller of framework kan zorgen dat www.JOUWDOMEIN.nl/paneel/page/profiel.php?gebruikersnaam=rob naar www.JOUWDOMEIN.nl/paneel/profiel/rob wordt veranderd, en dat dit het zelfde wordt gedaan bij bv. Luuk dat www.JOUWDOMEIN.nl/paneel/page/profiel.php?gebruikersnaam=luuk dit wordt: www.JOUWDOMEIN.nl/paneel/profiel/luuk alvast bedankt voor de uitleg.
Het is eigenlijk, zoals Thomas v/d Heuvel al eerder zegt, de beste oplossing om met een enkele rewrite rule alles door te verwijzen naar de index.php. Als je dan de $_SERVER['REQUEST_URI'] ontleedt dan kan je alles wat tussen de slashes staat apart in een array-element zetten.
Een mooi artikel daarover heeft hij geschreven op: http://fangorn.thijma.nl/news/redirecting-all-requests-to-index-php-with-htaccess
Code (php)
1
2
3
4
2
3
4
http://mijnsite.nl/ gaat naar /index.php
http://mijnsite.nl/about gaat naar /index.php
http://mijnsite.nl/contact gaat naar /index.php
http://mijnsite.nl/contact/confirmation gaat naar /index.php
http://mijnsite.nl/about gaat naar /index.php
http://mijnsite.nl/contact gaat naar /index.php
http://mijnsite.nl/contact/confirmation gaat naar /index.php
In index.php wordt vervolgens gekeken wat de opgevraagde route was:
Code (php)
1
2
3
4
2
3
4
http://mijnsite.nl/ route: /
http://mijnsite.nl/about route: /about
http://mijnsite.nl/contact route: /contact
http://mijnsite.nl/contact/confirmation route: /contact/confirmation
http://mijnsite.nl/about route: /about
http://mijnsite.nl/contact route: /contact
http://mijnsite.nl/contact/confirmation route: /contact/confirmation
Aan de hand van de route wordt vervolgens een controller aangeroepen. (lees: voor iedere route een aparte controller).
Een controller is een gewone PHP class met een aantal methods (functies)
Iedere (public) method is vervolgens het begin waarin een bepaalde pagina opgebouwd gaat worden. Dit begint doorgaans met het verzamelen van data, meestal uit de database. Vervolgens wordt de HTML opgebouwd.
Voordelen
Er zijn best een aantal behoorlijke voordelen te benoemen. Je hebt bijvoorbeeld geen problemen meer met relatieve paden omdat je altijd vanuit hetzelfde punt begint; namelijk /index.php Een ander voordeel is dat je heel makkelijk een autoloader voor je classes kunt gebruiken waarna je ook geen include of require meer hoeft te gebruiken.
Het komt de beveiliging en de structuur ook ten goede. Als laatste zo even uit het hoofd heb je direct de user-friendly URL's waar ik in het andere topic al over begon. En je bent van de .php extensies af in je url's.
Gewijzigd op 13/12/2016 21:26:22 door Frank Nietbelangrijk
Als ik eerder ben snao ik hier helemaal niks van... Frank Nietbelangrijk? Hoe kan ik daarmee zorgen dat /gebruikersnaam=rob naar /rob wordt veranderd? Ariën? Ik snap niet echt hoe ik daarmee dan die link kan veranderen. Kan iemand mij even precies uitleggen hoe dat werkt en niet doorlinken naar scripts in het engels want daar begrijp ik sowieso al veel minder van.. Alvast bedankt!
Dus met www.domein.nl/gebruiker/rob zal je op de eerste positie van je array (array's beginnen in PHP bij 0) je naam Rob vinden.
Dus $path[1].
Gewijzigd op 14/12/2016 17:55:27 door - Ariën -
Je maakt in dat artikel twee bestandjes aan op de root van je website. een .htaccess bestand en een index.php bestand. En wat gebeurd er dan?
Quote:
Hoe kan ik daarmee zorgen dat /gebruikersnaam=rob naar /rob wordt veranderd? Ariën?
Daar zit niks magisch in.
Die links moet je zelf bouwen, dus hard coded maken.
Dus als je de link:
http://www.domein.tld/gebruiker/rob/ maakt.
Dan word je link vertaald onderwater naar:
http://www.domain.tld/profiel.php?gebruikersnaam=rob
Dus in je html moet jij alleen de links maken als:
De voodoo gebeurd onderwater, maar de code van de link moet je zelf doen.
Het is niet zo dat er een oplossing is om profiel=?rob "zomaar" ineens als link /rob is.
Gewijzigd op 15/12/2016 08:58:02 door Bart V B
http://www.domein.tld/gebruiker/rob/ ?
Ja maar hoe kan ik dan die gebruikersnaam krijgen bij - Ariën -:
Quoten van het voorgaande bericht is niet nodig.
Gewijzigd op 15/12/2016 16:04:35 door - Ariën -
Een simpel voorbeeldje voor een simpele ledenlijst waarin je de usernaam ophaalt en linkbaar maakt.
Code (php)
Aan de hand van de waarde waar op die plek in de URl (in dit geval 'rob' moet je script de juiste gegevens van Rob erbij pakken. Als er Tim staat pak je Tim etc.
Als er helemaal geen gebruiker bestaat met die naam, dan toon je een foutmelding met daarin dat de naam niet bekend is.
Gewijzigd op 15/12/2016 16:06:03 door - Ariën -
Wat je ook nog zou kunnen overwegen is het volgende. Je zou de ontleding van een URL nog verder kunnen opdelen. Volgens mij had @Frank het in een ander recent topic over slugs. Dit zijn in wezen de partjes in de URL die van belang zijn voor je applicatie (en dus ook: de onderdelen waaruit het applicatie-pad is opgebouwd). Alle slugs bij elkaar vormen het applicatie-pad. Voor bovengenoemde functionaliteit zijn applicatie-paden bijvoorbeeld:
gebruiker/rob (slugs: gebruiker, rob)
gebruiker/henk (slugs: gebruiker, henk)
et cetera
De eerste slug is altijd "gebruiker". Als je -heel simpel gesteld- de REQUEST_URI explode op "/" dan heb je meteen alle partjes. Je zou dan de eerste slug ("gebruiker") kunnen gebruiken om bijvoorbeeld gebruiker.php te includen die vervolgens iets met de tweede ("rob", "henk") en volgende slugs doet. Op deze manier houd je je index.php schoon en generiek. Hier wordt immers niets specifieks gedaan met betrekking tot gebruikers, index.php include enkel een ander bestand dat het specifieke werk verricht.
Gewijzigd op 15/12/2016 16:45:51 door Thomas van den Heuvel
Code (php)
1
2
3
4
5
2
3
4
5
$sql = "SELECT username FROM users";
$result = $con->query($sql);
while($data = $result->fetch_assoc()) {
echo '<li><a href="/gebruiker/'.$data['username'].'">'.ucfirst($data['username']).'</li>';
}
$result = $con->query($sql);
while($data = $result->fetch_assoc()) {
echo '<li><a href="/gebruiker/'.$data['username'].'">'.ucfirst($data['username']).'</li>';
}
dit geeft die dan steeds als error: Call to a member function fetch_assoc() on a non-object
$con = new mysqli("localhost", "user", "password", "databasename");
Gewijzigd op 15/12/2016 18:33:20 door - Ariën -