如何在 symfony 模板中有一个来自 db 的全局变量?
How to have a global variable coming from db in symfony template?
我怎样才能在 symfony 模板中有一个全局变量?
我读过 this
但我更喜欢从数据库中获取参数,我认为该服务将在启动时加载,然后才能从数据库中获取任何内容。这样做有可能吗?
编辑: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: ~
现在您可以使用实体管理器执行您想要的请求。
不要忘记替换路径和名称空间以匹配您的应用程序。
你可以注册一个树枝扩展
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() 函数将其传递给模板
而是创建一个自定义的 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
截至今天,class 签名已更改。您必须实施 \ Twig_Extension_GlobalsInterface,没有它,您的全局变量将不会显示。
class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }
再见!
我怎样才能在 symfony 模板中有一个全局变量? 我读过 this 但我更喜欢从数据库中获取参数,我认为该服务将在启动时加载,然后才能从数据库中获取任何内容。这样做有可能吗?
编辑: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: ~
现在您可以使用实体管理器执行您想要的请求。
不要忘记替换路径和名称空间以匹配您的应用程序。
你可以注册一个树枝扩展
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() 函数将其传递给模板
而是创建一个自定义的 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
截至今天,class 签名已更改。您必须实施 \ Twig_Extension_GlobalsInterface,没有它,您的全局变量将不会显示。
class MyTwigExtension extends \Twig_Extension implements Twig_Extension_GlobalsInterface
{ }
再见!