Kontynuujemy temat routingu. Teraz dołączymy obsługę query params do naszego mini-routera, w następnych lekcjach postaramy napisać się już router z prawdziwego zdarzenia.

Nasz plik .htaccess:

RewriteEngine On
RewriteRule ^ entry.php

Nasz home_index.php:

<?php 
echo "from home_index.php";
if(isset($_GET['q'])){
    echo htmlspecialchars($_GET['q']);
}

Nasz product_list.php:

<?php 
echo "from product_list.php";
if(isset($_GET['q'])){
    echo htmlspecialchars($_GET['q']);
}

Teraz entry.php:

<?php 

class Helper {
    public static function request_uri()
    {
        print_r(parse_url($_SERVER['REQUEST_URI']));
    }
}

//http://localhost/sometry/home/index

Helper::request_uri();
//Array ( [path] => /sometry/home/index )

Dodajmy query_string, żeby zobaczyć, co wtedy się dzieje:

<?php 

class Helper {
    public static function request_uri()
    {
        print_r(parse_url($_SERVER['REQUEST_URI']));
    }
}

//http://localhost/sometry/home/index?q=blabla

Helper::request_uri();
//Array ( [path] => /sometry/home/index 
//[query] => q=blabla )

Jak widać to, co nas interesuje, znajduje się pod kluczem path, zaś query string ląduje pod kluczem query.

Teraz możemy napisać resztę kodu wzorując się na przykładzie z lekcji poprzedniej:

<?php 

class Helper {
    public static function request_uri()
    {
        $uri = parse_url($_SERVER['REQUEST_URI']);
        $path = explode("/", $uri['path']);
        $action = array_pop($path);
        $controller =  array_pop($path);
        $filepath = __DIR__ . "/{$controller}_{$action}.php";
        if(file_exists($filepath)){
            require $filepath;
        }
        else {
            die("Wrong URI");
        }
    }
}

//http://localhost/sometry/home/index?q=blabla

Helper::request_uri();
//from home_index.phpblabla

Wszystko działa, niezależnie od tego, czy mamy query string, czy nie mamy.

Swoją drogą – obsługą query stringa zajmują się pliki kontroler_akcja.php, w naszym routingu tego nie potrzebujemy.

Jedyne co potrzebujemy, to mechanizm, który pobiera ścieżkę, ignorując query stringi. Możemy zatem uprościć nasz parse_url:

<?php 

class Helper {
    public static function request_uri()
    {
        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        $path = explode("/", $path);
        $action = array_pop($path);
        $controller =  array_pop($path);
        $filepath = __DIR__ . "/{$controller}_{$action}.php";
        if(file_exists($filepath)){
            require $filepath;
        }
        else {
            die("Wrong URI");
        }
    }
}

//http://localhost/sometry/home/index
Helper::request_uri();
//from home_index.php

Routingiem z prawdziwego zdarzenia zajmiemy się w lekcjach późniejszych, ale potrzebowaliśmy tych podstaw przed dodaniem warstwy abstrakcji.