5

我想知道如何获取当前页面名称,基本上“只是”路由中的最后一个参数(即/news 或/about)。我这样做是因为我希望能够突出显示导航中的当前页面。

理想情况下,我想将当前页面名称存储在一个全局变量中,以便在 Twig 中我可以将当​​前页面名称与链接进行比较并相应地添加一个类。

我不知道如何将当前页面名称添加到全局变量中。我试过使用这样的东西:

$app['twig']->addGlobal('current_page_name', $app['request']->getRequestUri());

在我的 app.php 文件的顶部,但出现“超出请求范围”错误。但我不想在每条路线中都包含这个。

最好的方法是什么?

4

2 回答 2

16

如果你把它放在像这样的中间件之前的应用程序级别,那将起作用:

$app->before(function (Request $request) use ($app) {
    $app['twig']->addGlobal('current_page_name', $request->getRequestUri());
});

您问题的“页面名称”部分不清楚,您是在寻找当前路线的名称吗?您$request->get("_route")甚至可以在之前的中间件中访问它,因为它在路由已经完成时被调用。

于 2013-01-18T20:57:54.370 回答
1

您也可以直接在独立的导航树枝模板中生成导航列表。然后将其导入主模板。然后,您只需让 silex 将当前页面标识符传递给视图。最简单的方法...例如,从 Silex 您必须将“路径”变量传递给您的视图。从数据库中获取 nav_list 并将其作为全局数组变量传递给 twig 模板可能会更方便。然而,这个例子是你可以做的最简单的事情。

导航.twig

{% set nav_list = [
  ["./",        "home"],
  ["./contact", "contact"],
  ["./about",   "about us"]
  {# ... #}
] %}

{% set link_active = path|default("") %}

{% for link in nav_list %}
  <li><a href="{{ link[0] }}" class="{% if link[0] == link_active %} activeClass {% endif %}" >{{ link[1] }}</a></li>
{% endfor %}

应用程序.php

//...
    $app->match('/about', function (Request $request) use ($app) {
        return $app['twig']->render('about.twig', array(
            'path' => './'.end(explode('/', $request->getRequestUri()))
        ));
    });
//...
于 2016-03-03T03:53:39.030 回答