Twig中的Symfony2内部路由渲染功能

Ser*_*hyk 2 php routing symfony doctrine-orm twig

我的layout.html.twig:

{{ render(controller('AcmeDemoBundle:Page:mainmenu')) }}
Run Code Online (Sandbox Code Playgroud)

Page控制器检索来自主义的所有页面,并呈现mainmenu.html.twig一组页面.

我的mainmenu.html.twig:

{% if menu_pages is defined %}
    {% for page in menu_pages %}
        <li class="{% if app.request.attributes.get('_internal') == '_page_show' and app.request.get('id') == page.id %}active{% endif %}"><a href="{{ path('_page_show', {id: page.id}) }}">{{ page.title|e }}</a></li>
    {% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

但是没有active显示课程.据我所知,问题出在内部路由上.如何解决?

Vic*_*sky 6

最好不要使用{{ render(controller('AcmeDemoBundle:Page:mainmenu')) }}.当您使用服务时,它可以更快速,更舒适地工作.您可以创建一个服务,该服务将在您包含它们的任何页面上显示菜单.在服务中,您可以轻松访问当前_route的添加active类.

但是如果你真的需要使用{{ render(controller('AcmeDemoBundle:Page:mainmenu')) }},那么你需要传递给他们当前的请求,如:

{{ render(controller('AcmeDemoBundle:Page:mainmenu', {'request': app.request})) }}
Run Code Online (Sandbox Code Playgroud)

然后在行动中向树枝传递请求:

public function mainmenuAction($request) {

    return $this->render('AcmeDemoBundle:Page:mainmenu.html.twig', array('request' => $request));
}
Run Code Online (Sandbox Code Playgroud)

并在树枝中使用此请求:

{% if menu_pages is defined %}
    {% for page in menu_pages %}
        <li class="{% if request.get('_route') == '_page_show' and request.get('id') == page.id %}active{% endif %}"><a href="{{ path('_page_show', {id: page.id}) }}">{{ page.title|e }}</a></li>
    {% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)