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.
Je wilt altijd flexibiliteit houden over hoe je routes eruit zien.
Conclusie: routes netjes opslaan, en maken zoals je ze zelf wil. Geen gedoe met bestandsnamen.
Ja, inderdaad. Je krijgt dan dus zoiets:

route = contact:
- controller = ContactController
- action = IndexAction
Dit heb ik ondertussen:

index.php

<?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.
je kan nog een stapje verder gaan met variabele routes zoals die ook in dit forum gebruikt worden:

http://www.phphulp.nl/php/forum/topic/mvc-routing/93198

<?php
$router->add(array("route" => "forum/topic/:slug/:id", "destination" => "forum-showtopic.php", "methods" => array("all")));

// de controller
class ShowtopicController extends BaseController
{
public function indexAction($slug, $id)
{
// test
echo 'slug: ' . $slug . '<br>';
echo 'id: ' . $id . '<br>';
}
}
?>
@Frank, wat wordt bedoeld met "slug" en wat houdt methods "all" in?
Ozzie een slug is een gedeelte van je url: bijvoorbeeld: hoe-kan-ik-grote-bestanden-uploaden

En je tweede vraag zou je aan Harry moeten vragen maar ik dacht dat het voor GET & POST staat.
>> 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:

route = "forum/topic/hoe-kan-ik-grote-bestanden-uploaden/:id"

Of... wacht even.. bedoel je dat het de (variabele) titel van een topic is? En zo ja, waarom dan niet:

route = "forum/topic/:title/:id"

>> En je tweede vraag zou je aan Harry moeten vragen maar ik dacht dat het voor GET & POST staat.

oké
>> 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.
Dankjewel voor je toelichting Wouter... maar stel nu dat het iemands username is, dus

forum/user/wouterj/123

Is "wouterj" dan ook een "slug"?

Wat versta je precies onder een slug? En is iedere variabele die in de url staat en niet een id is automatisch een slug?

Reageren