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

在處理 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 首選工具。
下載 devel module 並安裝它(亦可參見 Downloading and Installing a Module from Drupal.org)。
從項目的根目錄(您站點 composer.json 的所在地)使用 Composer 安裝 kint-phplibrary,命令如下:composer require kint-php/kint --dev。
清除緩存。使用管理選單,導航到配置 > 開發 > 性能(admin/config/development/performance),並選擇清除所有緩存。
配置 Kint 作為您的 Variables Dumper 首選工具。使用管理選單,導航到配置 > 開發 > Devel 設置(admin/config/development/devel),在 Variables Dumper 標題下選擇 Kint,然後儲存配置。
像 dump 函數一樣,kint() 函數只有在啟用偵錯模式時才會顯示任何輸出。Learn how to enable Twig debugging
在您的 .twig 文件中,使用 kint() 來檢查變數,就像上面描述的 dump() 一樣。
選擇性地下載並安裝 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>

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

在處理 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 首選工具。
下載 devel module 並安裝它(亦可參見 Downloading and Installing a Module from Drupal.org)。
從項目的根目錄(您站點 composer.json 的所在地)使用 Composer 安裝 kint-phplibrary,命令如下:composer require kint-php/kint --dev。
清除緩存。使用管理選單,導航到配置 > 開發 > 性能(admin/config/development/performance),並選擇清除所有緩存。
配置 Kint 作為您的 Variables Dumper 首選工具。使用管理選單,導航到配置 > 開發 > Devel 設置(admin/config/development/devel),在 Variables Dumper 標題下選擇 Kint,然後儲存配置。
像 dump 函數一樣,kint() 函數只有在啟用偵錯模式時才會顯示任何輸出。Learn how to enable Twig debugging
在您的 .twig 文件中,使用 kint() 來檢查變數,就像上面描述的 dump() 一樣。
選擇性地下載並安裝 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>