Hallo Rolf,
danke für die Tipps! Da muss ich mich aber wirklich erst noch reinlesen. Das mit den Code-Attributen habe ich bisher noch nirgends gesehen.
Dann werde ich die HTTP-Methode doch in der Route belassen.
Bei mir sieht das auf der index.php momentan so aus:
$router -> add( 'GET', '', [ 'controller' => 'home'] );
$router -> add( 'GET', '{ controller }' );
$router -> add( 'GET', '{ namespace }/{ controller }' );
$router -> dispatch( $uri );
Und die dazugehörige Funktionen:
public function add( string $httpMethod, string $route, array $params = [] ): void
{
$route = preg_replace( '/\//', '\\/', $route );
$route = preg_replace( '/\{ ([a-z]+) \}/', '(?P<\1>[a-z-]+)', $route );
$route = preg_replace( '/\{ ([a-z]+):([^\}]+) \}/', '(?P<\1>\2)', $route );
$route = '/^' . $route . '$/i';
$this -> routes[$route][$httpMethod] = $params;
}
public function getMatches( $uri ): bool
{
$uri = substr( $uri, 1 );
$uri = $this -> removeQueryString( $uri );
foreach ( $this -> routes as $route => $params ) {
if ( preg_match( $route, $uri, $matches ) ) {
foreach ( $matches as $key => $match ) {
is_string( $key ) ? $params[$key] = $match : '';
}
$this -> params = $params;
return true;
}
}
return false;
}
public function dispatch( string $uri ): void
{
$uri = $this -> removeQueryString( $uri );
if ( $this -> getMatches( $uri ) ) {
$params = $this -> params;
isset( $params['controller'] )
? $controller = $params['controller']
: $controller = $params[$_SERVER['REQUEST_METHOD']]['controller'];
$controller = $this -> convertToStudlyCaps( $controller );
$controller = $this -> getNamespace() . $controller;
class_exists( $controller )
? $controller = new $controller( $this -> params )
: "Seite nicht gefunden.";
}
else {
echo 'Seite nicht gefunden.';
}
}
So funktioniert bisher alles.
Grüße
Boris