模板变量中的Twig事件监听器(钩子)

时间:2012-07-03 03:33:23

标签: events variables hook listener twig

我脑子里有一些需要在当前项目中实施的东西。我将用下面的例子来解释:

我将在许多模板中使用以下变量结构:

{% if article.tags is iterable %}
    {% for tag in article.tags %}
        {{ tag.title }}
    {% endfor %}
{% endif %}

正如您在上面的#1行中所看到的,然后我将分配“文章”变量数据,其具有来自PHP的“标签”数据列表到常用的Twig模板加载器。但是,我不想从数据库加载“标签”数据并分配给模板,因为我认为它将使用我的服务器连接和资源甚至是否使用“标签”数据。

所以我认为最好的方法是使用事件监听器(hook)概念,在Twig中实现,下面是进程:

1)在加载模板之前,我正在PHP文件的某个地方准备一个监听器:$ this-> twig-> addListenerMethod($ this,'tags');

2)当Twig解析“tags”变量时,它会检查是否有一个监听器,该变量具有相同的方法名称。

3)当侦听器找到时,Twig将通过传递父对象(article)作为第一个参数来调用指定的方法。

4)当调用该方法时,它将按原样处理并返回所需的“标签”数据列表。

我的问题是:

1)在Twig源文件中我可以开始查看并在Twig中实现事件监听器(hook)概念吗?

2)是否有人使用Twig进行相同的实现,如上所述?

3)或有人提出一些建议?

我希望我能对此提出很多建议,同时我也在挖掘Twig来源。

感谢。

亲切的问候。

1 个答案:

答案 0 :(得分:1)

我找到了自己问题的解决方案:

我只需要为模板指定一个“文章”对象:

$template->render(array(
  'article' => new Article()
);

以下是对象“文章”的外观:

class Article
{
  public function tags($args)
  {
    return array(
      array(
        'title' => 'oke',
        'desc' => 'lorem ipsum'
      ),
      array(
        'title' => 'oke 1',
        'desc' => 'lorem ipsum 1'
      )
    );
  }
}

如果你想传递方法“标签”的参数,请使用下面的例子:

{% if article.tags('param_1', 'param_n') is iterable %}
  {% for tag in article.tags('param_1', 'param_n') %}
    {{ tag.title }}
  {% endfor %}
{% endif %}