移至主內容
首頁  >  Drupal目錄  >  在Twig模板中發現和檢查變數

在Twig模板中發現和檢查變數

Tag :
Twig, dump
Written by Shiuan on 29 November 2023

在處理 Twig 模板文件時,大部分的數變數都會在模板文件的註釋中進行說明。然而,當它們沒有被記錄,或者當主題或模組引入新的變數時,我們需要一種方法來查看在模板範圍內可用的所有變數。Twig 提供了dump()函數,用於在模板文件中發現和檢查變數。

dump()函數只有在啟用了偵錯 (debugging) 模式時才會顯示任何輸出。Learn how to enable Twig debugging

一旦啟用,dump()函數就可以用來輸出有關模板中的變數或變數的訊息。


檢查單一變數

如果您的模板中有一個名為 title 的變數,以下代碼將會將其內容輸出到您的模板:

{{ dump(title) }}


發現模板中所有可用的變數

要在模板中輸出所有可用的變數及其內容,請在模板中添加以下代碼(在啟用偵錯模式之後):

{{ dump() }}

要僅輸出可用變數鍵,請使用以下代碼:

{{ dump(_context|keys) }}

所有 Twig 模板中都有額外的全域變數:

  • _self 引用當前模板,包含有關模板的高級訊息,例如編譯後的模板 class name 和有關 Twig 環境的訊息。_self was deprecated and removed from Twig version 2.x.

  • _context 引用當前上下文,包含傳遞給模板的所有變數,例如從 theme() 發送的變數,由 preprocess 準備的變數,或在模板中設置的變數。添加 {{ dump() }} 而不指定變數等同於 {{ dump(_context) }}

  • _charset 引用當前字符集。

這些技術僅會對非計算值的鍵進行輸出。例如,您可能在 node.field_main_image.target_id 中有一個ID。您可以通過 node.field_main_image.entity 訪問實體,但實體鍵不會出現在鍵列表中,因為它是一個計算值。


注意 dump()(在Drupal 9.5之前)

在 Drupal 9.5之前,dump() 經常由於遞迴而導致內存耗盡。為了解決這個問題,您可以遍歷 _context 以查看其中的所有鍵:

<ol>
 {% for key, value in _context  %}
   <li>{{ key }}</li>
 {% endfor %}
</ol>

然後使用條件語句來檢查(例如:{% if loop.index == 2 %}),僅在必要時才輸出該值。

在Drupal版本9.5以及更高版本中,dump() 是 Symfony vardumper 的包裝器,不具有這個問題。


使用xdebug進行偵錯

偵錯的最常見方式是使用帶有 xdebug 外掛的 IDE。

設置最簡單的配置是使用 PHPstorm(商業版)和 xdebug。Microsoft 的 VSCode 是一個免費的開源 IDE,具有相同的外掛,但無需購買商業軟體 。

使用 xdebug 將允許您逐步進行過程,查看變數內容,以一種消除幕後謎團的方式進行,同時防止使用 dump 或 kint 時可能出現的無窮迴圈。

一個叫做 twig_xdebug 的小模組可能有助於在 xdebug 中顯示可用的變數。


使用kint進行偵錯

作為對 dump() 的替代方案,有一個名為 kint 的 PHP 偵錯工具 (kint, a PHP debugging tool)kint() 函數的工作方式與上面描述的 dump() 函數完全相同,但為其顯示的變數提供了可展開/摺疊的界面。

Kint 曾包含在 devel project 中,但現在不再是這種情況。但是,您將使用 Devel 配置 Kint 作為您的 Variables Dumper 首選工具。

  1. 下載 devel module 並安裝它(亦可參見 Downloading and Installing a Module from Drupal.org)。

  2. 從項目的根目錄(您站點 composer.json 的所在地)使用 Composer 安裝 kint-phplibrary,命令如下:composer require kint-php/kint --dev。 

  3. 清除緩存。使用管理選單,導航到配置 > 開發 > 性能(admin/config/development/performance),並選擇清除所有緩存。 

  4. 配置 Kint 作為您的 Variables Dumper 首選工具。使用管理選單,導航到配置 > 開發 > Devel 設置(admin/config/development/devel),在 Variables Dumper 標題下選擇 Kint,然後儲存配置。

  5. dump 函數一樣,kint() 函數只有在啟用偵錯模式時才會顯示任何輸出。Learn how to enable Twig debugging

  6. 在您的 .twig 文件中,使用 kint() 來檢查變數,就像上面描述的 dump() 一樣。 

  7. 選擇性地下載並安裝 Devel Kint Extras module 以搜尋嵌套變數列表。

如果默認的 {{ kint() }} 破壞了您的頁面,您可以添加 dump 的最大深度。在默認的情況下,Kint 的深度為 7 層,這在某些情況下可能太深了。從 Kint ^4 開始,可以通過在您的 settings(.local).php 中添加深度限制來調整這一點。Read more in this Github Gist

// Change kint max_depth setting.
if (class_exists('Kint')) {
 // Set the max_depth to prevent out-of-memory.
 \Kint::$depth_limit = 4;
}


允許方法和class的策略

在處理物件時,我們允許通過 TwigSandboxPolicy class 呼叫某些 getter 和 setter 或 objects。這樣做是為了防止在模板中意外呼叫的方法。例如,在節點物件上使用 {{ node.delete }} 可能會刪除節點,如果沒有設置允許的策略。您可以透過將以下內容添加到您的 settings.php 中擴展允許的策略:

$settings['twig_sandbox_allowed_methods'] = [
 'id',
 'label',
 'bundle',
 'get',
 '__toString',
 'toString',
 'referencedEntities',
];

其中 referencedEntities 是您希望在模板中使用的方法。


使用 console.log 進行偵錯

我們可以在 Twig 模板中添加以下內容,並在瀏覽器中查看日誌:

<script>console.log({{ _context | json_encode | raw}});</script>

返回Drupal
首頁  >  Drupal  >  在Twig模板中發現和檢查變數

在Twig模板中發現和檢查變數

Tag :
Twig, dump
Written by Shiuan on 29 November 2023

在處理 Twig 模板文件時,大部分的數變數都會在模板文件的註釋中進行說明。然而,當它們沒有被記錄,或者當主題或模組引入新的變數時,我們需要一種方法來查看在模板範圍內可用的所有變數。Twig 提供了dump()函數,用於在模板文件中發現和檢查變數。

dump()函數只有在啟用了偵錯 (debugging) 模式時才會顯示任何輸出。Learn how to enable Twig debugging

一旦啟用,dump()函數就可以用來輸出有關模板中的變數或變數的訊息。


檢查單一變數

如果您的模板中有一個名為 title 的變數,以下代碼將會將其內容輸出到您的模板:

{{ dump(title) }}


發現模板中所有可用的變數

要在模板中輸出所有可用的變數及其內容,請在模板中添加以下代碼(在啟用偵錯模式之後):

{{ dump() }}

要僅輸出可用變數鍵,請使用以下代碼:

{{ dump(_context|keys) }}

所有 Twig 模板中都有額外的全域變數:

  • _self 引用當前模板,包含有關模板的高級訊息,例如編譯後的模板 class name 和有關 Twig 環境的訊息。_self was deprecated and removed from Twig version 2.x.

  • _context 引用當前上下文,包含傳遞給模板的所有變數,例如從 theme() 發送的變數,由 preprocess 準備的變數,或在模板中設置的變數。添加 {{ dump() }} 而不指定變數等同於 {{ dump(_context) }}

  • _charset 引用當前字符集。

這些技術僅會對非計算值的鍵進行輸出。例如,您可能在 node.field_main_image.target_id 中有一個ID。您可以通過 node.field_main_image.entity 訪問實體,但實體鍵不會出現在鍵列表中,因為它是一個計算值。


注意 dump()(在Drupal 9.5之前)

在 Drupal 9.5之前,dump() 經常由於遞迴而導致內存耗盡。為了解決這個問題,您可以遍歷 _context 以查看其中的所有鍵:

<ol>
 {% for key, value in _context  %}
   <li>{{ key }}</li>
 {% endfor %}
</ol>

然後使用條件語句來檢查(例如:{% if loop.index == 2 %}),僅在必要時才輸出該值。

在Drupal版本9.5以及更高版本中,dump() 是 Symfony vardumper 的包裝器,不具有這個問題。


使用xdebug進行偵錯

偵錯的最常見方式是使用帶有 xdebug 外掛的 IDE。

設置最簡單的配置是使用 PHPstorm(商業版)和 xdebug。Microsoft 的 VSCode 是一個免費的開源 IDE,具有相同的外掛,但無需購買商業軟體 。

使用 xdebug 將允許您逐步進行過程,查看變數內容,以一種消除幕後謎團的方式進行,同時防止使用 dump 或 kint 時可能出現的無窮迴圈。

一個叫做 twig_xdebug 的小模組可能有助於在 xdebug 中顯示可用的變數。


使用kint進行偵錯

作為對 dump() 的替代方案,有一個名為 kint 的 PHP 偵錯工具 (kint, a PHP debugging tool)kint() 函數的工作方式與上面描述的 dump() 函數完全相同,但為其顯示的變數提供了可展開/摺疊的界面。

Kint 曾包含在 devel project 中,但現在不再是這種情況。但是,您將使用 Devel 配置 Kint 作為您的 Variables Dumper 首選工具。

  1. 下載 devel module 並安裝它(亦可參見 Downloading and Installing a Module from Drupal.org)。

  2. 從項目的根目錄(您站點 composer.json 的所在地)使用 Composer 安裝 kint-phplibrary,命令如下:composer require kint-php/kint --dev。 

  3. 清除緩存。使用管理選單,導航到配置 > 開發 > 性能(admin/config/development/performance),並選擇清除所有緩存。 

  4. 配置 Kint 作為您的 Variables Dumper 首選工具。使用管理選單,導航到配置 > 開發 > Devel 設置(admin/config/development/devel),在 Variables Dumper 標題下選擇 Kint,然後儲存配置。

  5. dump 函數一樣,kint() 函數只有在啟用偵錯模式時才會顯示任何輸出。Learn how to enable Twig debugging

  6. 在您的 .twig 文件中,使用 kint() 來檢查變數,就像上面描述的 dump() 一樣。 

  7. 選擇性地下載並安裝 Devel Kint Extras module 以搜尋嵌套變數列表。

如果默認的 {{ kint() }} 破壞了您的頁面,您可以添加 dump 的最大深度。在默認的情況下,Kint 的深度為 7 層,這在某些情況下可能太深了。從 Kint ^4 開始,可以通過在您的 settings(.local).php 中添加深度限制來調整這一點。Read more in this Github Gist

// Change kint max_depth setting.
if (class_exists('Kint')) {
 // Set the max_depth to prevent out-of-memory.
 \Kint::$depth_limit = 4;
}


允許方法和class的策略

在處理物件時,我們允許通過 TwigSandboxPolicy class 呼叫某些 getter 和 setter 或 objects。這樣做是為了防止在模板中意外呼叫的方法。例如,在節點物件上使用 {{ node.delete }} 可能會刪除節點,如果沒有設置允許的策略。您可以透過將以下內容添加到您的 settings.php 中擴展允許的策略:

$settings['twig_sandbox_allowed_methods'] = [
 'id',
 'label',
 'bundle',
 'get',
 '__toString',
 'toString',
 'referencedEntities',
];

其中 referencedEntities 是您希望在模板中使用的方法。


使用 console.log 進行偵錯

我們可以在 Twig 模板中添加以下內容,並在瀏覽器中查看日誌:

<script>console.log({{ _context | json_encode | raw}});</script>