樹枝過濾器
與 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 }}