Rozbudowa routera – pozwalamy na placeholdery w naszych ścieżkach. Tworzymy metodę, która zamienia ścieżkę na wzór. Do dzieła.
Na początku zobaczmy, jak wygląda route z placeholderami i jak je zamienić na wzór regex:
$path = '/transaction/{transaction}/receipt/{receipt}/';
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
echo $path . "<br>";
///transaction/{transaction}/receipt/{receipt}/
echo $regexPath ."<br>";
///transaction/([^/]+)/receipt/([^/]+)/
Teraz zobaczmy, czy taki nasz wzór będzie w ogóle działał:
<?php
$path = '/transaction/{transaction}/receipt/{receipt}/';
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
echo $path . "<br>";
///transaction/{transaction}/receipt/{receipt}/
echo $regexPath ."<br>";
///transaction/([^/]+)/receipt/([^/]+)/
var_dump(preg_match("#^{$regexPath}$#", '/transaction/123/receipt/helloworld/'));
//int(1)
Jak widać działa. Btw używamy znakó „#” do zaznaczenia początku i końca wzoru, żeby się nie gryzły ze znakami „/”.
Zobaczmy, jak działa wyciąganie danych z placeholderów:
<?php
$path = '/transaction/{transaction}/receipt/{receipt}/';
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
echo $path . "<br>";
///transaction/{transaction}/receipt/{receipt}/
echo $regexPath ."<br>";
///transaction/([^/]+)/receipt/([^/]+)/
var_dump(preg_match("#^{$regexPath}$#", '/transaction/123/receipt/helloworld/', $paramValues));
//int(1)
print_r($paramValues);
// Array (
// [0] => /transaction/123/receipt/helloworld/
// [1] => 123
// [2] => helloworld )
Ok, zostawmy sobie w paramValues tylko to, czego potrzebujemy:
<?php
$path = '/transaction/{transaction}/receipt/{receipt}/';
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
echo $path . "<br>";
///transaction/{transaction}/receipt/{receipt}/
echo $regexPath ."<br>";
///transaction/([^/]+)/receipt/([^/]+)/
var_dump(preg_match("#^{$regexPath}$#", '/transaction/123/receipt/helloworld/', $paramValues));
//int(1)
array_shift($paramValues);
print_r($paramValues);
// Array (
// [0] => 123
// [1] => helloworld )
Postarajmy się teraz ze ścieżki uzyskać klucze:
<?php
$path = '/transaction/{transaction}/receipt/{receipt}/';
//(...)
preg_match_all('#{([^/]+)}#', $path, $paramKeys);
print_r($paramKeys);
// Array (
// [0] => Array (
// [0] => {transaction}
// [1] => {receipt}
// )
// [1] => Array (
// [0] => transaction
// [1] => receipt
// )
// )
Ok, nazwy kluczy tylko:
$path = '/transaction/{transaction}/receipt/{receipt}/';
//(...)
preg_match_all('#{([^/]+)}#', $path, $paramKeys);
$paramKeys = $paramKeys[1];
print_r($paramKeys);
// Array (
// [0] => transaction
// [1] => receipt )
Teraz łączymy klucze z wartościami i mamy params:
$path = '/transaction/{transaction}/receipt/{receipt}/';
$regexPath = preg_replace('#{[^/]+}#', '([^/]+)', $path);
echo $path . "<br>";
///transaction/{transaction}/receipt/{receipt}/
echo $regexPath ."<br>";
///transaction/([^/]+)/receipt/([^/]+)/
var_dump(preg_match("#^{$regexPath}$#", '/transaction/123/receipt/helloworld/', $paramValues));
//int(1)
array_shift($paramValues);
print_r($paramValues);
// Array (
// [0] => 123
// [1] => helloworld )
preg_match_all('#{([^/]+)}#', $path, $paramKeys);
$paramKeys = $paramKeys[1];
print_r($paramKeys);
// Array (
// [0] => transaction
// [1] => receipt )
$params = array_combine($paramKeys, $paramValues);
print_r($params);
// Array (
// [transaction] => 123
// [receipt] => helloworld
// )
Składaniem tego do OOP zajmiemy się w następnej lekcji.