2013-01-18 44 views
5

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

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

我想不出如何将当前页面名称添加到全局变量。我一直在使用这样的尝试:

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

我app.php文件的顶部,而是一个“请求范围之外”的错误。但我不想在每条路线中都包含这一点。

这样做的最好方法是什么?

回答

15

如果你把它变成像这样的中间件之前应用级的,那会工作:

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

你的问题的“页面名称”部分不清楚,你找当前路由的名字?即使在之前的中间件中也可以通过$request->get("_route")来访问它,因为它在路由已经完成时被调用。

+0

感谢,伟大工程!我更新了我的问题,以更好地解释我的意思。 – Pete

1

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

nav.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 %} 

app.php

//... 
    $app->match('/about', function (Request $request) use ($app) { 
     return $app['twig']->render('about.twig', array(
      'path' => './'.end(explode('/', $request->getRequestUri())) 
     )); 
    }); 
//...