Я не знаю, как это объяснить, поэтому, пожалуйста, будьте осторожны со мной.
Маршрутизатор содержит переменный ключ URI
$router = 'movie/english/{slug}/edit/(id}/{title}';
URI в адресной строке браузера
$uri = 'movie/english/scorpion/edit/125/E01E05';
Как я могу написать код, который сопоставит переменную-заполнитель маршрутизатора со значением, соответствующим URI. Например.
array(
'slug' => 'scorpion',
'id' => '125',
'title' => 'E01E05'
);
Пожалуйста, если вы понимаете, вы можете перенаправить меня на правильный ресурс.
Вы можете написать собственное решение для этого, но вы будете показывать колесо каждый раз, когда вам понадобится что-то большее, поэтому мой совет использует лучшие практики:
composer require symfony/routing
<?php
require './vendor/autoload.php';
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
$route = new Route(
'/movie/english/{slug}/edit/{id}/{title}',
array('controller' => 'MyController')
);
$routes = new RouteCollection();
$routes->add('route_name', $route);
$context = new RequestContext();
$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match('/movie/english/scorpion/edit/125/E01E05');
var_dump($parameters);
напечатает:
массив (размер = 5) 'controller' => строка 'MyController' (длина = 12) 'slug' => строка 'скорпион' (длина = 8) 'id' => строка '125' (длина = 3) 'title' => строка 'E01E05' (длина = 6) '_route' => строка 'route_name' (длина = 10)
Я искренне верю, что это лучшее решение, надеюсь, оно вам поможет.
Если я правильно понимаю, что вы спрашиваете, трансформируя $router
в $uri
через массив деталей может быть достигнуто с str_replace:
$router = 'movie/english/{slug}/edit/{id}/{title}';
$details = array(
'slug' => 'scorpion',
'id' => '125',
'title' => 'E01E05'
);
$uri = str_replace(array('{slug}','{id}','{title}'), $details, $router);
echo $uri;
// movie/english/scorpion/edit/125/E01E05