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.