วิธีการตัวแปร var_dump ในแม่แบบกิ่งไม้?


156

ดูรูปแบบเลเยอร์ที่คุณนำเสนอเฉพาะสิ่งที่คุณได้รับแล้วก็โอเคและทั้งหมด แต่คุณจะรู้ได้อย่างไรว่ามีอะไรบ้าง มีฟังก์ชั่น "รายการตัวแปรที่กำหนดไว้ทั้งหมด" ใน TWIG หรือไม่ มีวิธีการทิ้งตัวแปรหรือไม่

วิธีแก้ปัญหาที่ฉันค้นพบโดยค้นหามันคือการกำหนดฟังก์ชั่นที่ฉันสามารถใช้เครื่องมือดีบัก php ที่มีอยู่ของฉันโดยการฉีดฟังก์ชั่นแต่การอ้างอิงทั้งหมดที่ฉันพบพบว่ามีโค้ดสองบรรทัดที่ดีเหล่านี้ วางพวกเขา ด้วยความจริงที่ว่าพวกเขาต้องการตัวแปร$ loaderฉันได้ลอง /app/config/autoload.php แต่ $ loader มีชนิดผิด ฉันจะวางโค้ด php เพื่อเพิ่มฟังก์ชั่น twig ได้ที่ไหน?

คำตอบ:


251

ตั้งแต่ Twig 1.5 คำตอบที่ถูกต้องคือใช้ฟังก์ชัน dump มันเป็นเอกสารอย่างเต็มที่ในเอกสารทวิ นี่คือเอกสารประกอบเพื่อเปิดใช้งานสิ่งนี้ภายใน Symfony2

{{ dump(user) }}

3
BTW โปรดใช้ความระมัดระวังเมื่อทิ้งวัตถุด้วยการทำแผนที่เชิงสัมพันธ์
pleerock

14
เมื่อฉันใช้{{ dump() }}เพื่อดัมพ์ตัวแปรทั้งหมดมันจะส่งคืนหน้าเปล่า มีวิธีอื่นในการดัมพ์ตัวแปรหรือไม่?
Jerry Pham

ฉันกำลังใช้ Symfony 2.5 รุ่นล่าสุดและเปิดใช้งานการตั้งค่า config.yml และ config_dev.yml และโหมดดีบักเมื่อโหลดเคอร์เนลสำหรับสภาพแวดล้อมการพัฒนา ฉันได้ลองใช้วิธีอื่น ๆ ที่ Morland กล่าวไว้ด้านล่างแล้ว ทั้งสองวิธีฉันยังได้รับหน้าว่างเมื่อใช้การถ่ายโอนข้อมูล และไม่มีการถ่ายโอนข้อมูล
Chadwick Meyer

หากคุณได้รับหน้าว่างที่มีและไม่มีเครื่องหมายdumpชัดว่าdumpไม่ใช่ปัญหา ฉันขอแนะนำให้โพสต์คำถามใหม่ถ้าคุณไม่สามารถหาคำตอบได้
Icode4food

1
ฉันได้รับข้อผิดพลาดต่อไปนี้: `Twig_Error_Syntax - ฟังก์ชัน" dump "ที่ไม่รู้จัก"
Pathros

28

คุณสามารถใช้debugแท็กซึ่งเป็นเอกสารที่นี่

{% debug expression.varname %}

แก้ไข: ตั้งแต่วันที่ Twig 1.5 สิ่งนี้เลิกใช้แล้วและแทนที่ด้วยdumpฟังก์ชั่นใหม่(โน้ตตอนนี้มันเป็นฟังก์ชั่นและไม่มีแท็กแล้ว) ดูเพิ่มเติม: คำตอบที่ได้รับการยอมรับข้างต้น


7
หากคุณพบข้อผิดพลาดUnknown tag name "debug"ให้ขยายการกำหนดค่าของคุณ (ทั้งในระดับโลกconfig.ymlและconfig_dev.yml) ตามที่อธิบายไว้ที่นี่: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
flu

5
วิธีนี้เลิกใช้เมื่อวันที่ Twig 1.5
Icode4food

4
เพิ่มบันทึกการคัดค้านคำตอบ
igorw

17

ดังนั้นฉันได้มันทำงานส่วนหนึ่งบิตแฮ็ค:

  1. ตั้งtwig: debug: 1อยู่ที่app/config/config.yml
  2. เพิ่มลงใน config_dev.yml

    services:
        debug.twig.extension:
            class: Twig_Extensions_Extension_Debug
            tags: [{ name: 'twig.extension' }]
    
  3. sudo rm -fr app/cache/dev

  4. ในการใช้ฟังก์ชั่นการดีบักของฉันเองprint_r()ฉันก็เปิดvendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpและเปลี่ยนprint_r(เป็นd(

PS ฉันยังต้องการทราบวิธี / สถานที่ที่จะคว้าสภาพแวดล้อม $ twig เพื่อเพิ่มตัวกรองและส่วนขยาย


1
btw: สำหรับการล้างแคชคุณสามารถใช้เครื่องมือคอนโซล ( stackoverflow.com/questions/6789950/ … )
Raffael

มีข้อดีที่จะทำเช่นนั้น?
Alexander Morland

มันตรงไปตรงมามากขึ้น ... ถ้าคุณไม่ทราบว่าเครื่องมือคอนโซลผมขอแนะนำให้คุณตรวจสอบออก
Raffael

3
คุณไม่ควรตั้งค่าtwig: debug: 1เพราะเป็นการรับข้อมูลนี้จากสภาพแวดล้อมของตัวควบคุมด้านหน้าของคุณ มิฉะนั้นคุณสามารถลงเอยด้วยการส่งออกข้อมูลการดีบักโดยไม่ตั้งใจในสภาพแวดล้อมของคุณ ตราบใดที่คุณกำลังทำงานในสภาพแวดล้อม dev จะเปิดใช้งานตามค่าเริ่มต้นและจะปิดใช้งานในสภาพแวดล้อมการทำงานของคุณ
ไข้หวัดใหญ่

1
สิ่งนี้ล้าสมัยเมื่อ Twig 1.5 ดูคำตอบอื่น ๆ : stackoverflow.com/a/10080404/107768
Icode4food

14

หากคุณใช้ Twig ในแอปพลิเคชันของคุณเป็นส่วนประกอบคุณสามารถทำได้:

$twig = new Twig_Environment($loader, array(
    'autoescape' => false
));

$twig->addFilter('var_dump', new Twig_Filter_Function('var_dump'));

จากนั้นในเทมเพลตของคุณ:

{{ my_variable | var_dump }}

จะวาง / เปลี่ยนที่$twig = new Twig_Environment($loader, array(...ใด
PolGraphic

5

หากคุณใช้ Twig เป็นส่วนประกอบแบบสแตนด์อโลนนี่เป็นตัวอย่างของวิธีการเปิดใช้งานการดีบักเนื่องจากไม่น่าเป็นไปได้ว่าฟังก์ชันการถ่ายโอนข้อมูล (ตัวแปร)จะทำงานนอกกรอบโดยตรง

แบบสแตนด์อโลน

พบได้ที่ลิงค์ของ icode4food

$twig = new Twig_Environment($loader, array(
    'debug' => true,
    // ...
));
$twig->addExtension(new Twig_Extension_Debug());

Silex

$app->register(new \Silex\Provider\TwigServiceProvider(), array(
    'debug' => true,
    'twig.path' => __DIR__.'/views'
));

5

ดัมพ์ตัวแปรที่กำหนดเองทั้งหมด:

<h1>Variables passed to the view:</h1>
{% for key, value in _context %}
    {% if key starts with '_' %}
    {% else %}
        <pre style="background: #eee">{{ key }}</pre>
        {{ dump(value) }}
    {% endif %}
{% endfor %}

คุณสามารถใช้ปลั๊กอินของฉันซึ่งจะทำเพื่อคุณ (จะจัดรูปแบบผลลัพธ์):

Twig Dump Bar


ตัวอย่างที่ดี ขอบคุณ. ใช้ได้กับฉันถ้าฉันแทนที่ dump (value) ด้วย value | var_dump
matthijs koevoets

3

{{ dump() }}ไม่ได้ผลสำหรับฉัน PHPฉายา ระดับการทำรังลึกเกินไปฉันเดา

ทั้งหมดที่คุณต้องการจริงๆที่จะdebugแม่แบบทวิถ้าคุณกำลังใช้debuggerเป็นส่วนขยายเช่นนี้

จากนั้นเป็นเพียงเรื่องของการตั้งค่าเบรกพอยต์และโทรไป{{ inspect() }}ทุกที่ที่คุณต้องการ คุณได้รับข้อมูลเช่นเดียวกับ{{ dump() }}แต่ในดีบักเกอร์ของคุณ


3

ตั้งแต่ Symfony> = 2.6 มีองค์ประกอบVarDumper ที่ดีแต่ไม่ได้ใช้โดยdump()ฟังก์ชันของ Twig

หากต้องการเขียนทับเราสามารถสร้างส่วนขยาย:

ในการนำไปใช้ต่อไปนี้อย่าลืมแทนที่เนมสเปซ

Fuz/AppBundle/Resources/config/services.yml

parameters:
   # ...
   app.twig.debug_extension.class: Fuz\AppBundle\Twig\Extension\DebugExtension

services:
   # ...
   app.twig.debug_extension:
       class: %app.twig.debug_extension.class%
       arguments: []
       tags:
           - { name: twig.extension }

Fuz/AppBundle/Twig/Extension/DebugExtension.php

<?php

namespace Fuz\AppBundle\Twig\Extension;

class DebugExtension extends \Twig_Extension
{

    public function getFunctions()
    {
        return array (
              new \Twig_SimpleFunction('dump', array('Symfony\Component\VarDumper\VarDumper', 'dump')),
        );
    }

    public function getName()
    {
        return 'FuzAppBundle:Debug';
    }

}

ใช่ผมกำลังมองหานี้ :)
ทิม Strijdhorst

2

สูตรสมบูรณ์สำหรับการอ้างอิงที่รวดเร็วขึ้น (โปรดทราบว่าทุกขั้นตอนมีผลบังคับใช้):

1) เมื่อ instantiating Twig ผ่านตัวเลือกการแก้ปัญหา

$twig = new Twig_Environment(
$loader, ['debug'=>true, 'cache'=>false, /*other options */]
);

2) เพิ่มส่วนขยายการดีบัก

$twig->addExtension(new \Twig_Extension_Debug());

3) ใช้เหมือน @Hazarapet Tunanyan

{{ dump(MyVar) }}

หรือ

{{ dump() }}

หรือ

{{ dump(MyObject.MyPropertyName) }}

1

สำหรับการแก้จุดบกพร่องแม่แบบทวิคุณสามารถใช้คำสั่งการแก้ปัญหา

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถกำหนดการตั้งค่าการดีบักได้อย่างชัดเจน


ฉันจะได้รับ 'ชื่อแท็กที่ไม่รู้จัก "การแก้ปัญหา' ที่มีและไม่มีการตั้งค่า twig.debug ว่า: จริง
อเล็กซานเด Morland

หากคุณทำงานในโหมด prod คุณต้องล้างแคชก่อน
Raffael

@AlexanderMorland สวัสดีอเล็กซ์คุณต้องขยายการกำหนดค่าของคุณตามที่อธิบายไว้ที่นี่: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861เพื่อกำจัดUnknown tag name "debug"ข้อผิดพลาด
ไข้หวัดใหญ่

1

คุณสามารถแก้ไข

/vendor/twig/twig/lib/Twig/Extension/Debug.php

และเปลี่ยนthe var_dump()ฟังก์ชั่นเป็น\Doctrine\Common\Util\Debug::dump()


3
ไม่แนะนำให้แก้ไขสิ่งใดภายใต้โฟลเดอร์ผู้จัดจำหน่าย
Luis Milanese

1

ในฐานะที่เป็นโปรแกรมเมอร์ PHP ที่ดีส่วนใหญ่ต้องการใช้ XDebug เพื่อก้าวผ่านการเรียกใช้รหัสและดูการเปลี่ยนแปลงของตัวแปรในแบบเรียลไทม์โดยใช้dump()ความรู้สึกเหมือนย้อนกลับไปในอดีต

นั่นเป็นเหตุผลที่ฉันทำส่วนขยาย Twig Debug และวางไว้บน Github

https://github.com/delboy1978uk/twig-debug

composer require delboy1978uk/twig-debug

จากนั้นเพิ่มส่วนขยาย หากคุณไม่ได้ใช้ Symfony เช่นนี้

<?php

use Del\Twig\DebugExtension;

/** @var $twig Twig_Environment */
$twig->addExtension(new DebugExtension());

หากคุณเป็นเช่นนี้ในบริการของคุณ YAML config:

twig_debugger:
    class: Del\Twig\DebugExtension
    tags:
        - { name: twig.extension }

เมื่อลงทะเบียนแล้วคุณสามารถทำได้ทุกที่ในเทมเพลตกิ่ง:

{{ breakpoint() }}

ตอนนี้คุณสามารถใช้ XDebug การดำเนินการจะหยุดชั่วคราวและคุณสามารถดูคุณสมบัติทั้งหมดของทั้งบริบทและสิ่งแวดล้อม

มีความสุข! :-D


0

คุณสามารถใช้ฟังก์ชั่นการถ่ายโอนข้อมูลและพิมพ์แบบนี้

{{ dump(MyVar) }}

แต่มีสิ่งหนึ่งที่ดีเช่นกันหากคุณไม่ได้ตั้งค่าอาร์กิวเมนต์ให้เป็นฟังก์ชันการถ่ายโอนข้อมูลมันจะพิมพ์ตัวแปรทั้งหมดที่มีอยู่เช่น

{{ dump() }}

ใช่ใช้งานได้ แต่คุณต้องตรวจสอบให้แน่ใจว่ามีการเปิดใช้งานการดีบักในตัวเลือกเมื่อสร้างทวิกซ์
Tudor Ilisoi

0

หากคุณอยู่ในสภาพแวดล้อมที่ไม่สามารถใช้dumpฟังก์ชั่น (เช่น opencart) คุณสามารถลอง:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.