如何在 symfony 模板中有一个全局变量?我确实读过这个 ,但我更喜欢从数据库中获取参数,我认为这个服务将在启动时加载,然后它才能从数据库中获取任何东西。有可能这样做吗?
问问题
5180 次
4 回答
12
编辑:2019 年更新为 Symfony 3.4+ 语法。
在注入实体管理器的地方创建一个 Twig 扩展:
Fuz/AppBundle/Twig/Extension/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: ~
现在您可以使用实体管理器执行您想要的请求。
不要忘记替换路径和命名空间以匹配您的应用程序。
于 2015-01-15T14:36:45.127 回答
3
到今天为止,类签名已经改变。您必须实现 \Twig_Extension_GlobalsInterface,没有它,您的全局变量将不会显示。
class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }
再见!
于 2017-06-04T22:55:52.880 回答
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() 函数将其传递给模板
于 2015-01-15T14:42:25.190 回答
2
远离全局变量。
而是制作一个自定义树枝扩展,然后将数据库连接作为参数注入。
就像是:
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/template/twig_extension.html
于 2015-01-15T14:45:18.420 回答