Php 正在分析当前uri以获取分部内的当前路由参数。如何避免?
要在base.twig视图中呈现TOC(类别树),我调用Php 正在分析当前uri以获取分部内的当前路由参数。如何避免?,php,symfony,twig,silex,Php,Symfony,Twig,Silex,要在base.twig视图中呈现TOC(类别树),我调用render()函数传递相应的操作url: {% block sidebar %} {{ render(url('toc_documents_categories')) }} {% endblock %} '/toc/documents'操作(\u toc.documents\u categories.twig)的匹配局部视图定义如下: {% set category_id = (current_uri|split('
render()
函数传递相应的操作url:
{% block sidebar %}
{{ render(url('toc_documents_categories')) }}
{% endblock %}
'/toc/documents'
操作(\u toc.documents\u 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 %}
访问部分视图中的路由信息(global.request.attributes.get(“'u 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');
然后在局部视图中,您只需引用传递的活动\u类别\u id参数:
{% if categories %}
<div id="categories">
<ul>
{% for category in categories %}
{{ _self.recursiveCategory(category, active_category_id) }}
{% endfor %}
</ul>
</div>
{% endif %}
{%if类别%}
{categories%%中的类别为%s}
{{{u self.recursiveCategory(category,active{u category\u id)}
{%endfor%}
{%endif%}
感谢@keyboardSmasher对“为什么不在渲染函数中传递category_id”的评论。但我不确定我是否按照他设想的方式做了这件事。以下是解决方案
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');
然后在局部视图中,您只需引用传递的活动\u类别\u id参数:
{% if categories %}
<div id="categories">
<ul>
{% for category in categories %}
{{ _self.recursiveCategory(category, active_category_id) }}
{% endfor %}
</ul>
</div>
{% endif %}
{%if类别%}
{categories%%中的类别为%s}
{{{u self.recursiveCategory(category,active{u category\u id)}
{%endfor%}
{%endif%}
感谢@keyboardSmasher对“为什么不在渲染函数中传递category_id”的评论。但是我不确定我是否按照他设想的方式进行了操作。为什么不在
render
函数中传递category\u idbase.twig
将永远是最重要的请求。@keyboardSmasher非常感谢,我想我明白你的意思了!为什么不在render
函数中传递category_idbase.twig
将永远是最重要的请求。@keyboardSmasher非常感谢,我想我明白你的意思了!