Door
Mark Hogeveen
op 06-12-2013 15:46
gewijzigd op 06-12-2013 15:49
11.711 views
Hallo, misschien een erg simpele vraag.
Bij routing voor je website stuur je eigenlijk alle requests door naar 1 pagina. Meestal index.php.
Doe je dan dus ook de POST data daarnaartoe sturen? En hoe doe je die dan weer doorgeven aan de juiste controller?
En hoe doe je alle get variabelen verwerken? Doe je dan iets als $_GET[0], $_GET[1] etc?
Ik begrijp niet echt wat het voordeel is van een router. Je moet telkens de juiste controllers/models/vieuws includen, soms (volgens mij) onnodig een header gebruiken om een gebruiker door te sturen naar de juiste locatie.
Daarnaast lijkt me het controleren van GET variabelen moeilijker, alles doe je rewriten naar mooie URL's,
Dus dit: www.site.nl/help.php?action=view&item=10023 wordt dit: www.site.nl/help/view/10023
Aan de tweede url zou je niet meer kunnen zien of view een map is, of (de waarde van) een veriabale.
Niet dat dit voor buitenaf belangrijk is, of dat bezoekers hier iets mee moeten. Maar hierdoor lijkt het me verwarrend. Ook zou ik niet weten wat ik moet doen als een pagina direct wordt aangeroepen, dus niet door de router, maar rechtstreeks (zonder include, en dus zonder code die in de router eventueel erboven zou staan, voor het include statement)
Een error 404 geven is dan eigenlijk liegen, doorsturen naar de router en zo een omweg maken lijkt me ook raar.
<?php
// index.php
require "Request.php";
require "Router.php";
$router = new Router;
$router->add(array("route" => "", "destination" => "welcome.php", "methods" => array("all")));
$router->add(array("route" => "help", "destination" => "help.php", "methods" => array("GET"))); // kan het zo goed "all" zijn (alle methods)
$router->add(array("route" => "contact", "destination" => "contact.php", "methods" => array("GET"))); // kan het zo goed "all" zijn (alle methods)
$router->add(array("route" => "submit", "destination" => "submit.php", "methods" => array("POST")));
// Ingewikkelder
$router->add(array("route" => "shop/product/info/", "destination" => "productInfo.php", "methods" => array("GET", "POST"));
$router->matchRequest(new Request);
?>
Router.php
<?php
class Router {
private $_routes;
private $_destination;
private $_notFoundDestination = "notfound.php";
public function add(array $route = array()) {
$this->_routes[] = $route;
}
public function matchRequest(Request $request) {
if($request->getArgument('route') == "") {
$this->_destination = "welcome.php"; // Startpagina, normaal index.php
$this->navigate();
} else {
for($i = 0; $i < count($this->_routes); $i++) {
if($this->_routes[$i]["route"] == $request->getArgument('route')) {
if(in_array($request->getMethod(), $this->_routes[$i]["methods"]) || in_array("all", $this->_routes[$i]["methods"])) {
$this->_destination = $this->_routes[$i]["destination"];
$this->navigate();
return;
}
$this->notFound(); // verkeerde method
return;
}
}
$this->notFound(); // Loop door alle mogelijke routes gedaan, niks gevonden
}
}
public function navigate() {
require $this->_destination;
}
public function notFound() {
require $this->_notFoundDestination; // Error 404 pagina
}
}
?>
Request.php
<?php
// Request.php
class Request {
public function getMethod() {
return $_SERVER['REQUEST_METHOD'];
}
public function getArgument($name) {
return isset($_GET[$name]) ? $_GET[$name] : "";
}
}
?>
- Je kunt bij het definieren van een route aangeven of deze werkt op alle methods, of alleen post of get methods.
- Je geeft bij de route de bestandsnaam (of pad naar een bestand), de route is daar onafhankelijk van
Graag hoor ik commentaar, en dat zal vast wel veel zijn. Want ik weet dat deze code niet perfect is. Toch wilde ik het laten zien.
>> Ozzie een slug is een gedeelte van je url: bijvoorbeeld: hoe-kan-ik-grote-bestanden-uploaden
Wat is dan de bedoeling van een slug? Geef je daar eigenlijk de action mee aan? Ik dacht dat wat jij een slug noemt gewoon bij de route hoort. Dus zeg maar zoiets:
>> Of... wacht even.. bedoel je dat het de (variabele) titel van een topic is? En zo ja, waarom dan niet:
Omdat we dat nou eenmaal de slug noemen. Dat komt omdat het niet de titel is, je hebt spaties vervangen met dashes, alles gelowercased en url-unsafe-characters eruit gehaald. Dat noemen we een slugified title, afgekort een slug.