使用URI值映射路由器占位符


Map the router placeholder with the URI values

我不知道如何解释,所以请对我宽容一点。

路由器持有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)"鼻涕虫"=>字符串"蝎子"(长度=8)'id'=>字符串'125'(长度=3)'title'=>字符串'E01E05'(长度=6)'_route'=>字符串'route_name'(长度=10)

我真的相信这是最好的解决方案,希望它能帮助你。

如果我正确理解您的要求,可以使用str_replace:通过细节数组将$router转换为$uri

$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