解析当前uri以获取局部中的当前路由参数.如何避免


Parsing current uri to get the current route params inside a partial. How to avoid?

基中呈现TOC(类别树)。视图我调用render()函数,传递相应的操作url:

{% block sidebar %}
    {{ render(url('toc_documents_categories')) }}    
{% endblock %}

'/toc/documents'操作(_toc.documents_categories.twig)的匹配部分视图定义如下:

{% 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 global:

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

访问局部视图内的路由信息(global.request.attributes.get('_route'))显示的是对应的子请求路由名,而不是实际的请求路由名(主请求)。

是否有一种方法可以避免手动解析当前uri并获得局部视图内的当前请求路由参数?

解决方案如下:

render()发出子请求,因此您必须使用主请求上下文:

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"评论。但我不确定我是否按照他设想的那样做了。