Ik zie vaak allemaal ingewikkelde routers tegen komen op internet.
Na even te zoeken kwam ik een vrij simpele router tegen hier op PHPHulp.
Wat is de reden van een uitgebreide moeilijke router? Na mijn mening is dit toch prima?
Enige probleem dat ik nu nog heb, is dat wanneer ik nu naar /artikel/bewerk/234/ dat hij de route /artikel/ pakt, hoe kan ik dit op de beste manier oplossen? Alles een prioriteit meegeven, sorteren op langste route? Wat is de beste manier hiervoor? Of gewoon een kwestie van de routes aanmaken in de goede volgorde?
<?php
class Router
{
private $_routes;
public function __construct()
{
$this->_routes = array();
}
public function setRoute( Route $route )
{
$this->_routes[] = $route;
}
public function match( $query )
{
$routes = $this->_routes;
if( $routes )
{
foreach( $routes as $route )
{
$match = $route->match( $query );
if( $match )
{
return $match;
}
}
}
return false;
}
}
class Route
{
private $_regex;
private $_controller;
public function __construct( $pattern, $controller )
{
$this->_regex = preg_replace( '#:([a-z])+#','(?P<$1>[^/]+)', $pattern );
$this->_controller = $controller;
}
public function match( $query )
{
if( !preg_match( '#'.$this->_regex.'#', $query, $matches ) )
{
return false;
}
$controller = new Controller();
$controller->setName( $this->_controller );
return $controller;
}
}
class Controller
{
private $_name;
public function setName( $name )
{
$this->_name = $name;
}
public function getName()
{
return $this->_name;
}
}
$router = new Router();
$router->setRoute( new Route( '/artikel/', 'article.view.module') );
$router->setRoute( new Route( '/artikel/bewerk/:id', 'article.edit.module') );
$router->setRoute( new Route( '/artikel/verwijder/:id', 'article.delete.module') );
$controller = $router->match( $request->server( 'REDIRECT_URL' ) );
?>