2016-09-20 52 views
1

要渲染base.twig視圖我所說的render()函數傳遞給它相應的動作的url內TOC(類樹):解析當前uri以獲取部分內部的當前路由參數。如何避免?

{% block sidebar %} 

    {{ render(url('toc_documents_categories')) }}  

{% endblock %} 

'/toc/documents'動作的匹配部分視圖(_toc.documents_categories。小枝)的定義如下:

{% set category_id = (current_uri|split('/'))[4] %} 

{% macro recursiveCategory(category, active_category_id) %} 

    <li> 

     {% if category.children|length %} 

      <a><span class="icon icon-plus"></span>{{ category.name_displayed }}</a> 

     {% else %} 

      {% set active_class = active_category_id == category.id ? 'active' %} 
      {% set url = app.url_generator.generate('documents_by_category', {category_id: category.id}) %} 

      <a href="{{ url }}" class="{{ active_class }}"> 
       {{ category.name_displayed }} 
      </a> 

     {% endif %} 

     {% if category.children|length %} 
      <ul> 
       {% for child in category.children %} 
        {{ _self.recursiveCategory(child, active_category_id) }} 
       {% endfor %} 
      </ul> 
     {% endif %} 
    </li> 
{% endmacro %} 

{% if categories %} 
    <div id="categories"> 
     <ul> 
      {% for category in categories %} 
       {{ _self.recursiveCategory(category, category_id) }} 
      {% endfor %} 
     </ul> 
    </div> 
{% endif %} 

正如你可以看到我通過解析當前URL中提取當前類別的ID。這是通過設置前面所述current_uri全球:

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

訪問局部視圖內的路徑信息(global.request.attributes.get('_route'))示出了對應子請求路由名稱而不是實際的請求路由名稱(主機請求) 。

有沒有辦法避免手動解析當前uri,並獲得局部視圖內的當前請求路由參數?

+2

爲什麼不在'render'函數中傳遞category_id? 'base.twig'將始終是最上面的請求。 – keyboardSmasher

+0

@keyboardSmasher非常感謝你,我想我明白你的意思! – lexeme

回答

0

下面是解決方案。

render()發出subrequest,所以你必須使用主機請求上下文:

use Symfony\Component\HttpFoundation\Request 

$app->get('/documents_categories', function(Request $request) use($app) { 

    $master_request = $app['request_stack']->getMasterRequest(); 
    $current_route = $master_request->get('_route'); 
    $active_category_id = null; 

    if($current_route === 'documents_by_category') { 
     $active_category_id = $master_request->get('_route_params')['category_id']; 
    } 

    // ... do things: parse toc tree ... 

    return $app['twig']->render('_toc.documents.categories.twig', array(
     "categories" => $toc_tree, 
     "active_category_id" => $active_category_id 
    )); 

})->bind('toc_documents_categories'); 

然後,你必須只引用傳遞局部視圖內active_category_id參數:

{% if categories %} 
    <div id="categories"> 
     <ul> 
      {% for category in categories %} 
       {{ _self.recursiveCategory(category, active_category_id) }} 
      {% endfor %} 
     </ul> 
    </div> 
{% endif %} 

感謝@keyboardSmasher的'爲什麼不在傳遞函數中傳遞category_id n'評論。但我不確定我是否按照他的設想來完成。