从模板传递参数到Twig扩展名?

时间:2016-05-22 10:09:31

标签: php twig symfony

我使用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() }}

2 个答案:

答案 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') }}