如何在symfony模板中拥有全局变量? 我读过this 但我更喜欢从数据库中获取参数,我认为这个服务将在启动之前加载,然后才能从db中获取任何内容。是否有可能这样做?
答案 0 :(得分:10)
编辑:2019年使用Symfony 3.4+语法更新。
创建一个注入实体管理器的Twig扩展:
FUZ /的appbundle /枝条/扩展/ DatabaseGlobalsExtension.php
<?php
namespace Fuz\AppBundle\Twig\Extension;
use Doctrine\ORM\EntityManager;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
class DatabaseGlobalsExtension extends AbstractExtension implements GlobalsInterface
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function getGlobals()
{
return [
'myVariable' => $this->em->getRepository(FuzAppBundle\Entity::class)->getSomeData(),
];
}
}
在 Fuz / AppBundle / Resources / config / services.yml 中注册您的扩展程序:
services:
_defaults:
autowire: true
autoconfigure: true
Fuz\AppBundle\Twig\Extension\DatabaseGlobalsExtension: ~
现在,您可以使用实体管理器执行所需的请求。
不要忘记替换路径和名称空间以与您的应用程序匹配。
答案 1 :(得分:2)
您可以注册枝条延伸
services:
twig_extension:
class: Acme\DemoBundle\Extension\TwigExtension
arguments: [@doctrine]
tags:
- { name: twig.extension }
然后在TwigExtension中,您可以执行以下操作:
class TwigExtension extends \Twig_Extension
{
public function getGlobals() {
return array(
// your key => values to make global
);
}
}
因此,您可以从此TwigExtension中的数据库中获取值,并使用getGlobals()函数将其传递给模板
答案 2 :(得分:2)
而是创建自定义twig扩展,然后将数据库连接作为参数注入。
类似的东西:
services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\AcmeExtension
arguments: [@doctrine.dbal.default_connection]
tags:
- { name: twig.extension }
详细说明:
http://symfony.com/doc/current/cookbook/templating/twig_extension.html
答案 3 :(得分:2)
截至今天,班级签名已更改。你必须实现\ Twig_Extension_GlobalsInterface,没有它,你的全局变形不会出现。
class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }
再见!