Symfony 嵌入式控制器仅限于模板呈现

Symfony 嵌入式控制器仅限于模板呈现,symfony,symfony-2.1,Symfony,Symfony 2.1,在中,它建议通过呈现url方法在模板中嵌入控制器,并提供以下示例: <div id="sidebar"> {% render url('latest_articles', { 'max': 3 }) %} </div> {%render url('latest_articles',{'max':3})%} 这很好,但是,是否可以使此路由仅可供模板访问,以防止用户直接访问url,如果可以,建议使用什么方法?您可以通过不为此方法定义路由来实现这一点 class

在中,它建议通过
呈现url
方法在模板中嵌入控制器,并提供以下示例:

<div id="sidebar">
    {% render url('latest_articles', { 'max': 3 }) %}
</div>

{%render url('latest_articles',{'max':3})%}

这很好,但是,是否可以使此路由仅可供模板访问,以防止用户直接访问url,如果可以,建议使用什么方法?

您可以通过不为此方法定义路由来实现这一点

class TestController extends Controller
{
    /**
     * @Route("/", name="index")
     * @Template
     */
    public function indexAction()
    {

        return array();
    }

    /**
     * @Template
     */
    public function testAction()
    {
        return array(
            'text' => 'This text is being included'
        );
    }
}
然后在模板中

{% extends "::base.html.twig" %}

{% block body %}
    <h1>{{ hello }}</h1>

    {% render "TestBundle:Test:test" %}

{% endblock %}
{%extends”::base.html.twig“%}
{%block body%}
{{你好}}
{%render“TestBundle:Test:Test”%}
{%endblock%}

您可以将所有渲染的控制器路由模式定义为“/\u render/unique\u name”或以“\u render”作为前缀,并使用access\u control保护来自外部世界的路由:

# app/config/security.yml
security:
    access_control:
        - { path: ^/_render, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
        - { path: ^/_render, roles: ROLE_NO_ACCESS }

感谢您的建议,但正如@meze所指出的,这在2.2中不再有效,建议不要使用,因为以这种方式嵌入控制器会绕过安全层,从而导致系统漏洞。我不知道这一点。我注意到了这种做法,但它似乎是一种黑客行为,我渴望遵循最佳实践。你知道这是正确的方法还是没有其他方法?谢谢。是的,保护内部ESI路由的方法与保护内部ESI路由的方法相同,这是保护路由的唯一方法,因此很明显,要保护您想要隐藏在浏览器客户端的控制器路由。