细枝继承和symfony2控制器变量

细枝继承和symfony2控制器变量,symfony,inheritance,twig,Symfony,Inheritance,Twig,我尝试我的第一个项目使用symfony2+细枝。我用定义的块创建了基本的细枝模板。基本上是这样的 {% block content %} some content... {% endblock %} {% block footer %} {{ footer.content}} {% endblock %} 我希望所有页面的页脚都相同。页脚从DB及其在控制器中的设置加载。我想从上面描述的模板继承到其他页面,但我必须始终在控制器中设置页脚,否则变量未定义 我的问题是,是否存在为从父模板继

我尝试我的第一个项目使用symfony2+细枝。我用定义的块创建了基本的细枝模板。基本上是这样的

{% block content %}
  some content...
{% endblock %}

{% block footer %}
  {{ footer.content}}
{% endblock %}
我希望所有页面的页脚都相同。页脚从DB及其在控制器中的设置加载。我想从上面描述的模板继承到其他页面,但我必须始终在控制器中设置页脚,否则变量未定义

我的问题是,是否存在为从父模板继承的多个模板设置页脚变量的“好”方法?

解决方案:

在某些情况下,您需要做的不仅仅是包含一个简单的模板。 假设布局中有一个侧栏,其中包含三个 最近的文章。检索这三篇文章可能包括查询 数据库或执行其他无法从中完成的繁重逻辑 在模板中

解决方案是简单地嵌入整个控制器的结果 从你的模板。首先,创建一个控制器,用于呈现特定的 最近发表的文章数量:

控制器

查看

{{#app/Resources/views/article/recent_list.html.twig}
{文章%中的文章为%s}
{%endfor%}
布局

{#app/Resources/views/base.html.twig}

{{#…}
{{渲染(控制器)(
'AppBundle:文章:容器',
{'max':3}
)) }}

您可以使用以下操作之一“编写自定义细枝扩展”

<?php

namespace AppBundle\Extension;

class MyTwigExtension extends \Twig_Extension
{
    private $em;
    private $conn;

    public function __construct(\Doctrine\ORM\EntityManager $em) {
        $this->em = $em;
        $this->conn = $em->getConnection();
    }

    public function getFunctions()
    {
        return array(
            'users' => new \Twig_Function_Method($this, 'getUsers'),
        );
    }

    public function getUsers()
    {
        $sql = "SELECT * FROM users ORDER BY accountname";
        return $this->conn->fetchAll($sql);
    }

    public function getName()
    {
        return 'smproc4_twig_extension';
    }
}
使用自定义扩展名

Hello {{ name }}!
<ul>
{% for user in users() %}
    <li>{{ user.accountname }}</li>
{% endfor %}
</ul>
你好{{name}!
    {users()中的用户为%s}
  • {{user.accountname}
  • {%endfor%}
看一看这本书


非常感谢您复杂的解释。这正是我要找的。这里有一句警告的话。使用细枝扩展来查询数据库意味着您的布局结果将不会被缓存。所以你要做很多查询。我在这件事上伤了自己@自龙球的解决方案是我的建议。
{# ... #}
<div id="sidebar">
    {{ render(controller(
        'AppBundle:Article:recentArticles',
        { 'max': 3 }
    )) }}
</div>
<?php

namespace AppBundle\Extension;

class MyTwigExtension extends \Twig_Extension
{
    private $em;
    private $conn;

    public function __construct(\Doctrine\ORM\EntityManager $em) {
        $this->em = $em;
        $this->conn = $em->getConnection();
    }

    public function getFunctions()
    {
        return array(
            'users' => new \Twig_Function_Method($this, 'getUsers'),
        );
    }

    public function getUsers()
    {
        $sql = "SELECT * FROM users ORDER BY accountname";
        return $this->conn->fetchAll($sql);
    }

    public function getName()
    {
        return 'smproc4_twig_extension';
    }
}
services:
    my.twig.extension:
        class: AppBundle\Extension\MyTwigExtension
        tags:
            - { name: twig.extension }
        arguments:
            em: "@doctrine.orm.entity_manager"
Hello {{ name }}!
<ul>
{% for user in users() %}
    <li>{{ user.accountname }}</li>
{% endfor %}
</ul>