【问题标题】:Twig event listener (hook) in template variable模板变量中的 Twig 事件侦听器(挂钩)
【发布时间】:2012-07-03 11:36:04
【问题描述】:

我有一些想法需要在当前项目中实施。下面我用一个例子来解释:

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

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

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

所以我认为最好的方法是使用事件监听器(钩子)概念,在 Twig 内部实现,下面是过程:

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

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

3) 找到监听器后,Twig 将调用通过传递父对象(文章)作为其第一个参数指定的方法。

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

我的问题是:

1) 我可以在哪个 Twig 源文件中开始查看和实现 Twig 中的事件侦听器(挂钩)概念?

2) 是否有人已经使用 Twig 进行了与我上面描述的相同的实现?

3) 或者有人有什么建议?

我希望我能对此有很多建议,同时我也在挖掘 Twig 源代码。

谢谢。

亲切的问候。

【问题讨论】:

  • 当我在“getAttribute”上的“Template.php”文件中挖掘 Twig 源代码时,我想我已经找到了类似的解决方案>”方法,我发现我们可以在模板中将对象分配为变量,因此“article”应该分配为对象,“tags”将是方法。不,我的问题是,我将如何传递“getAttribute”方法中的“arguments”?

标签: events variables hook listener twig


【解决方案1】:

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

我只需为模板分配一个“Article”对象:

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

以下是对象“Article”的外观:

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

如果您想将参数传递给方法“tags”,只需使用以下示例:

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

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 2013-02-02
    • 1970-01-01
    • 2021-03-31
    • 2023-02-09
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多