2013-01-18 42 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())) 
     )); 
    }); 
//...