树枝过滤器
与 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 }}