twig继承和symfony2控制器变量

时间:2015-07-20 16:18:50

标签: symfony inheritance twig

我正在使用symfony2 + twig尝试我的第一个项目。我创建了具有已定义块的基本树枝模板。它基本上看起来像这样

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

{% block footer %}
  {{ footer.content}}
{% endblock %}

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

我的问题是,如果存在任何“好”的话。如何为从父模板继承的多个模板设置页脚变量?

2 个答案:

答案 0 :(得分:7)

解决方案:Embedding Controllers

  

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

     

解决方案是简单地嵌入整个控制器的结果   来自您的模板。首先,创建一个呈现某个特定的控制器   最近文章的数量:

<强> 控制器

// src/AppBundle/Controller/ArticleController.php
namespace AppBundle\Controller;
// ...

class ArticleController extends Controller
{
    public function recentArticlesAction($max = 3)
    {
        // make a database call or other logic
        // to get the "$max" most recent articles
        $articles = ...;

        return $this->render(
            'article/recent_list.html.twig',
            array('articles' => $articles)
        );
    }
}

<强> 查看

{# app/Resources/views/article/recent_list.html.twig #}
{% for article in articles %}
    <a href="/article/{{ article.slug }}">
        {{ article.title }}
    </a>
{% endfor %}

<强> 布局

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

{# ... #}
<div id="sidebar">
    {{ render(controller(
        'AppBundle:Article:recentArticles',
        { 'max': 3 }
    )) }}
</div>

答案 1 :(得分:0)

您可以使用以下其中一项,&#39;编写自定义的Twig Extension&#39;

<?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>

看看

How to Write a custom Twig Extension

Creating an Extension