2 Pluspunkte 0 Minuspunkte

Ich möchte eine Art Flask Router in PHP erstellen.

$requestURI = $_SERVER['REQUEST_URI'];

$routes = [
    '/' => 'HomeController@index',
    '/about' => 'AboutController@index',
    '/contact' => 'ContactController@index'
];

if (array_key_exists($requestURI, $routes)) {

    $controllerAction = $routes[$requestURI];
    
    $data = explode('@', $controllerAction);
    
    echo $data[0] . " -> " . $data[1];

} else {
    echo "404 - Seite nicht gefunden";
}

?>

Jetzt habe ich aber ein Problem. Wie kann ich die Routen

/posts/YYYY/
/posts/YYYY/MM/
/posts/YYYY/MM/DD
/posts/YYYY/MM/DD/POSTNAME

unterscheiden? Die Zahlen sind ja dynamisch, muss ich für jeden Fall eine Route bilden?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du kannst Regular Expressions nutzen um die Bestandteile der RequestURI zu extrahieren.

$requestURI = $_SERVER['REQUEST_URI'];

$routes = [
    '/posts/(\d{4})/(\d{2})/(\d{2})/([\w-]+)' => 'PostController@show',
    '/posts/(\d{4})/(\d{2})/(\d{2})' => 'PostController@showDate',
    '/posts/(\d{4})/(\d{2})' => 'PostController@showMonth',
    '/posts/(\d{4})' => 'PostController@showYear'
];

foreach ($routes as $routePattern => $controllerAction) {

    if (preg_match("#^$routePattern$#", $requestURI, $matches)) {

        array_shift($matches); // Entfernen Sie das erste Element (ganzer Treffer)
        
        $data = explode('@', $controllerAction);
        
        // ...

        break;

    }

}

if (!isset($matches)) {
    echo "404 - Seite nicht gefunden";
}

von