树枝过滤器

与 Drupal 7 相反,你无法在模板中调用常规 PHP 函数。在 Drupal 8 中,可以通过创建过滤器和函数来实现。

你应该在以下情况下使用过滤器 :你想要转换要显示的数据。想象一下,你有一个你想要永远是大写的标题。例如,twig 默认使用 capitalize 过滤器,允许你将任何文本转换为大写等效项。

对于此示例,我们将创建一个允许我们对字符串进行混洗的过滤器。创建过滤器和函数的方法与常规 Twig 完全相同。

常规 Twig 和 Drupal 8 Twig 之间的主要区别在于,在 Drupal 8 中,你必须创建正在创建的类的服务定义,并且该类还必须属于命名空间,否则它将不会在 Drupal 环境中注册为 Twig 过滤器。

此示例假定你有一个名为 twig_shuffle_extension 的模块。

这将是 twig_shuffle_extension.services.yml 的基本服务定义

services:
  twig_shuffle_extension.twig_extension:
    class: Drupal\twig_shuffle_extension\TwigExtension\TwigShuffleExtension
    tags:
      - { name: twig.extension }

tags 键也是绝对必需的,它告诉 Drupal 这个类应该做什么(即将它注册为 Twig 扩展)。

现在源代码必须放在服务定义的 class 键中定义的路径中。

// Don't forget the namespace!
namespace Drupal\twig_shuffle_extension\TwigExtension;

use Twig_Extension;
use Twig_SimpleFilter;

class TwigShuffleExtension extends Twig_Extension  {
  /**
   * This is the same name we used on the services.yml file
   */
  public function getName() {
    return 'twig_shuffle_extension.twig_extension';
  }

  // Basic definition of the filter. You can have multiple filters of course.
  // Just make sure to create a more generic class name ;)
  public function getFilters() {
    return [
      new Twig_SimpleFilter('shuffle', [$this, 'shuffleFilter']),
    ];
  }

  // The actual implementation of the filter.
  public function shuffleFilter($context) {
    if(is_string($context)) {
      $context = str_shuffle($context);
    }
    return $context;
  }
}

清除缓存,现在,如果一切按计划进行,你可以在模板中使用过滤器。

{{ "shuffle me!" | shuffle }}