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