我使用Twig扩展来传递数据库中的全局变量,如下面的代码所示。但我想通过id
参数来使数据从数据库中获取更加动态。
服务
app.twig.database_globals_extension:
class: Coursat\CoursatBundle\Twig\Extension\DatabaseGlobalsExtension
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: twig.extension }
扩展
<?php
namespace Coursat\CoursatBundle\Twig\Extension;
use Doctrine\ORM\EntityManager;
class DatabaseGlobalsExtension extends \Twig_Extension
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function getGlobals()
{
return array (
"myVariable" => $this->em->getRepository('CoursatBundle:test')->find(##I want to pass a var here from the template##),
);
}
public function getName()
{
return "CoursatBundle:DatabaseGlobalsExtension";
}
}
模板
{{ myVariable.name() }}
答案 0 :(得分:2)
将这个存储在您的全局变量中是一个非常糟糕的主意,因为您的网站每次调用都会请求您的数据库。
您可以使用函数来检索这些数据:
<?php
namespace Coursat\CoursatBundle\Twig\Extension;
use Doctrine\ORM\EntityManager;
class DatabaseGlobalsExtension extends \Twig_Extension
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('my_test', array($this, 'myTest')),
);
}
public function myTest($id)
{
return $this->em->getRepository('CoursatBundle:test')->find($id);
}
public function getName()
{
return "CoursatBundle:DatabaseGlobalsExtension";
}
}
然后在您的Twig模板中,使用它来加载您的实体:
{% set twigVar = my_test(42) %}
但这仍然是一种不好的做法,您应该在控制器中加载实体,而不是在视图中加载。
答案 1 :(得分:1)
class DatabaseGlobalsExtension extends \Twig_Extension
{
...
...
public function getFunctions() {
return array(
'get_db_global', function($key) {
$globals = $this->getGlobals();
return isset($globals[$key]) ? $globals[$key] : null;
}
);
}
...
...
}
内部树枝:
The global with key "Foo" is : {{ get_db_global('foo') }}