Php Symfony2细枝渲染函数中的内部路由
我的Php Symfony2细枝渲染函数中的内部路由,php,symfony,doctrine-orm,routing,twig,Php,Symfony,Doctrine Orm,Routing,Twig,我的layout.html.twig: {{ render(controller('AcmeDemoBundle:Page:mainmenu')) }} 页面控制器从条令中检索所有页面,并用一组页面呈现main menu.html.twig Mymain menu.html.twig: {% if menu_pages is defined %} {% for page in menu_pages %} <li class="{% if app.request.a
layout.html.twig
:
{{ render(controller('AcmeDemoBundle:Page:mainmenu')) }}
页面
控制器从条令中检索所有页面,并用一组页面呈现main menu.html.twig
Mymain menu.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 %}
{%如果定义了菜单页面%}
{%用于菜单中的页面\页面%}
{%endfor%}
{%endif%}
但不显示
活动
类。据我所知,问题在于内部路由。如何修复此问题?最好不要使用{{render(controller('AcmeDemoBundle:Page:main menu'))}
。当你改用它时,它工作得更快更舒适。您可以创建一个服务,该服务将在包含它们的任何页面上显示菜单。在服务中,您可以轻松访问添加活动
类的当前\u路线
但是如果您确实需要使用{render(controller('AcmeDemoBundle:Page:main menu'))}
,那么您需要向他们传递一个当前请求,如:
{{ render(controller('AcmeDemoBundle:Page:mainmenu', {'request': app.request})) }}
然后将请求传递给twig:
public function mainmenuAction($request) {
return $this->render('AcmeDemoBundle:Page:mainmenu.html.twig', array('request' => $request));
}
在twig中使用此请求:
{% 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 %}
{%如果定义了菜单页面%}
{%用于菜单中的页面\页面%}
{%endfor%}
{%endif%}
app.request.attributes.get(“\u route”)不起作用。因为它显示主页的当前路由,而不是由呈现(控制器(..)
细枝发出的内部路由method@Victor,为什么您认为{{render(controller())}}
很慢?那么{{render_hinclude(controller())}}
-你有使用hinclude的经验吗?我注意到,它比渲染(controller())慢,但Symfony仍然推荐它。最后但并非最不重要的一点是,您希望如何使用服务来代替?你是说控制器即服务吗?@Victor,你的意思可能是return$this->render
而不是$this->render
?这应该是一个响应。render\u hinclude
我不使用,但有render(controller())
的经验,在我重新组织此服务之前,它的工作速度稍慢一些。我创建了一个twig简单函数
,它按名称返回任何服务。而且我可以通过名字直接在twig中访问任何服务。为什么?:)如果我需要将不同操作的多个模板传递给服务,我可以将其传递给每个操作,或者从细枝模板调用它们。@Victor-如果将请求作为方法参数添加到控制器中,则请求将自动注入magic变量$\u request
。无需从模板传递app.request
!进一步的控制器作为服务通常不会更快。。。您仍然可以使用以下语法呈现作为服务的控制器:{{render(controller('controller\u service:mainmenu'))}
。请注意,使用symfony等反向代理或外部代理(即varnish)时,您的答案将不起作用。