樹枝過濾器

與 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 }}