borisbaer: Was gibt es beim Schreiben eines PHP-Routers zu beachten?

Beitrag lesen

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