6

我正在尝试从 Slim 框架中定义的路由构建一个动态下拉菜单,这是我的问题 - 有没有办法从某种数组访问所有定义的静态路由?

例如,如果我这样定义我的路线:

// Index page: '/'
require_once('pages/main.php');

// Example page: '/hello'
require_once('pages/hello.php');

// Example page: '/hello/world'
require_once('pages/hello/world.php');

// Contact page: '/contact'
require_once('pages/contact.php');

每个文件都是一个单独的页面,如下所示

// Index page
$app->get('/', function ($request, $response, $args) {

    // Some code

})->setName('index');

我想从某种数组访问所有这些定义的路由,然后使用该数组在我的模板文件中创建一个无序的 HTML 列表。

<ul>
  <li><a href="/">Index</a></li>
  <li><a href="/hello">Hello</a>
    <ul>
       <li><a href="/hello/world">World</a></li>
    </ul>
  </li>
  <li><a href="/contact">Contact</a></li>
</ul>

每当我更改定义的路线时,我都希望此菜单随之更改。有没有办法做到这一点?

4

4 回答 4

14

在 GitHub 项目中快速搜索 Slim 的Router 类会显示一个公共方法getRoutes(),它返回$this->routes[]路由对象数组。从路由对象中,您可以使用以下getPattern()方法获取路由模式:

$routes = $app->getContainer()->router->getRoutes();
// And then iterate over $routes

foreach ($routes as $route) {
    echo $route->getPattern(), "<br>";
}

编辑:添加示例

于 2016-11-09T20:48:45.697 回答
4

是的。您可以在 Slim中命名您的路线。这是以非常简单的方式完成的:

$app->get('/hello', function($request, $response) {
    // Processing request...
})->setName('helloPage'); // setting unique name for route

现在您可以按名称获取 URL,如下所示:

$url = $app->getContainer()->get('router')->pathFor('helloPage');
echo $url; // Outputs '/hello'

您也可以使用占位符命名路线:

// Let's define route with placeholder
$app->get('/user-profile/{userId:[0-9]+}', function($request, $response) {
    // Processing request...
})->setName('userProfilePage');

// Now get the url. Note that we're passing an array with placeholder and its value to `pathFor`
$url = $app->getContainer()->get('router')->pathFor('helloPage', ['userId': 123]);
echo $url; // Outputs '/user-profile/123'

这是肯定要走的路,因为如果您在模板中通过名称引用路由,那么如果您需要更改 URL,则只需在路由定义中进行。我觉得这特别酷。

于 2016-11-09T13:32:31.270 回答
2

正如我在相应的 slim问题中所评论的那样:

$routes = array_reduce($this->app->getContainer()->get('router')->getRoutes(), function ($target, $route) {
    $target[$route->getPattern()] = [
        'methods' => json_encode($route->getMethods()),
        'callable' => $route->getCallable(),
        'middlewares' => json_encode($route->getMiddleware()),
        'pattern' => $route->getPattern(),
    ];
    return $target;
}, []);
die(print_r($routes, true));
于 2019-05-17T07:59:49.170 回答
0

根据沃尔夫的回答,我已经提出了我的解决方案。

在您定义路线的页面中,在所有路线下方,我们将使用我们定义的路线创建一个容器。

// Get ALL routes
// --------------
$allRoutes = [];
$routes = $app->getContainer()->router->getRoutes();

foreach ($routes as $route) {
  array_push($allRoutes, $route->getPattern());
}

$container['allRoutes'] = $allRoutes;

这将创建一个包含我们稍后可以在项目中使用的所需路由的数组。

然后在您定义的路线中,您可以这样调用:

$app->get('/helloWorld', function ($request, $response, $args) {

  print_r ($this->allRoutes);

})->setName('helloWorld');

这将输出

Array
(
    [0] => /
    [1] => /helloWorld
    [2] => /someOtherRoute
    ...
)

这样我们就可以使用这个数组来创建我们想要的任何东西。再次感谢狼!

于 2016-11-10T13:09:34.973 回答