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.