Bagaimana cara var_dump variabel dalam templat ranting?

156

Lihat pola lapisan di mana Anda hanya menyajikan apa yang telah diberikan kepada Anda baik-baik saja, tetapi bagaimana Anda tahu apa yang tersedia? Apakah ada fungsi "daftar semua variabel yang ditentukan" di TWIG? Apakah ada cara untuk membuang variabel?

Solusi yang saya temukan dengan mencarinya adalah dengan mendefinisikan fungsi di mana saya dapat menggunakan alat debug debug yang ada dengan menyuntikkan fungsi , tetapi semua referensi yang saya temukan mencakup dua baris kode yang bagus ini, tetapi tidak ada tempat untuk menentukan di mana harus tempatkan mereka. Pergi oleh fakta bahwa mereka membutuhkan variabel $ loader didefinisikan, saya mencoba /app/config/autoload.php tetapi $ loader di sana adalah jenis yang salah. Di mana saya menempatkan kode php untuk menambahkan fungsi ranting?

Alexander Morland
sumber

Jawaban:

251

Pada Twig 1.5, jawaban yang benar adalah dengan menggunakan fungsi dump. Ini sepenuhnya didokumentasikan dalam dokumentasi Twig . Berikut adalah dokumentasi untuk mengaktifkannya di dalam Symfony2.

{{ dump(user) }}
Icode4food
sumber
3
BTW, berhati-hatilah saat membuang objek dengan pemetaan relasional
pleerock
14
Ketika saya gunakan {{ dump() }}untuk membuang semua variabel, itu mengembalikan halaman kosong. Apakah ada cara lain untuk membuang variabel?
Jerry Pham
Saya menggunakan versi terbaru dari Symfony 2.5, dan konfigurasi dan config_dev.yml config.yml dan mode debug dinyalakan ketika memuat kernel untuk lingkungan dev. Saya sudah mencoba metode manual lain yang disebutkan oleh Morland di bawah ini. Either way, saya juga mendapatkan halaman kosong ketika dump digunakan. Dan tidak ada dump.
Chadwick Meyer
Jika Anda mendapatkan halaman kosong dengan dan tanpa dump, jelas dumpitu bukan masalahnya. Saya akan menyarankan memposting pertanyaan baru jika Anda tidak dapat menemukannya sebaliknya.
Icode4food
1
Saya mendapatkan error berikut: `Twig_Error_Syntax - Unknown "Dump" function`
Patros
28

Anda dapat menggunakan debugtag, yang didokumentasikan di sini .

{% debug expression.varname %}

Sunting: Pada Twig 1.5, ini telah usang dan diganti dengan dumpfungsi baru (catatan, sekarang fungsi dan tidak lagi tag). Lihat juga: Jawaban yang diterima di atas.

igorw
sumber
7
Jika Anda mendapatkan pesan kesalahan Unknown tag name "debug", perpanjang konfigurasi Anda (baik di global config.ymlatau config_dev.yml) seperti dijelaskan di sini: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
flu
5
Metode ini sudah tidak digunakan pada Ranting 1.5.
Icode4food
4
Menambahkan catatan penghentian untuk jawabannya.
igorw
17

Jadi saya membuatnya bekerja, sebagian agak retas:

  1. Set twig: debug: 1inapp/config/config.yml
  2. Tambahkan ini ke config_dev.yml

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

  4. Untuk menggunakan fungsi debug saya sendiri print_r(), saya buka vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpdan ubah print_r(ked(

PS. Saya masih ingin tahu bagaimana / di mana mengambil lingkungan $ ranting untuk menambahkan filter dan ekstensi.

Alexander Morland
sumber
1
btw: untuk membersihkan cache, Anda dapat menggunakan alat konsol ( stackoverflow.com/questions/6789950/… )
Raffael
adakah manfaat untuk melakukan itu?
Alexander Morland
itu lebih mudah ... jika Anda tidak tahu alat konsol, saya sarankan Anda memeriksanya
Raffael
3
Anda tidak perlu mengatur twig: debug: 1karena mewarisi informasi ini dari lingkungan pengontrol depan Anda. Kalau tidak, Anda bisa berakhir dengan tidak sengaja mengeluarkan informasi debug di lingkungan prod Anda. Selama Anda bekerja di lingkungan dev, ia diaktifkan secara default dan dinonaktifkan di lingkungan prod Anda.
Flu
1
Ini sudah ketinggalan zaman pada Ranting 1.5. Lihat jawaban lain: stackoverflow.com/a/10080404/107768
Icode4food
14

Jika Anda menggunakan Ranting dalam aplikasi Anda sebagai komponen, Anda dapat melakukan ini:

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

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

Kemudian di templat Anda:

{{ my_variable | var_dump }}
Julio
sumber
Di mana menempatkan / menggantinya $twig = new Twig_Environment($loader, array(...?
PolGraphic
5

Jika Anda menggunakan Ranting sebagai komponen mandiri berikut ini beberapa contoh cara mengaktifkan debugging karena tidak mungkin fungsi dump (variabel) akan bekerja langsung di luar kotak

Standalone

Ini ditemukan pada tautan yang disediakan oleh 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'
));
Carlton
sumber
5

Buang semua variabel khusus:

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

Anda dapat menggunakan plugin saya yang akan melakukannya untuk Anda (dan akan memformat output dengan baik):

Ranting Dump Bar

kapitalny
sumber
potongan yang bagus. Terima kasih. ini berfungsi untuk saya jika saya mengganti dump (nilai) dengan nilai | var_dump
matthijs koevoets
3

{{ dump() }}tidak bekerja untuk saya. PHPtersedak. Tingkat sarang terlalu dalam kurasa.

Yang Anda perlukan untuk debugranting template jika Anda menggunakan debuggerekstensi adalah seperti ini .

Maka itu hanya masalah menetapkan breakpoint dan menelepon ke {{ inspect() }}mana pun Anda membutuhkannya. Anda mendapatkan info yang sama dengan {{ dump() }}tetapi di debugger Anda.

Christian Fecteau
sumber
3

Karena Symfony> = 2.6, ada komponen VarDumper yang bagus , tetapi tidak digunakan oleh dump()fungsi Twig .

Untuk menimpanya, kita dapat membuat ekstensi:

Dalam implementasi berikut, jangan lupa mengganti ruang nama.

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';
    }

}
Alain Tiemblo
sumber
Ya saya sedang mencari ini :)
Tim Strijdhorst
2

Resep lengkap di sini untuk referensi yang lebih cepat (perhatikan bahwa semua langkah adalah wajib):

1) saat membuat ranting, lewati opsi debug

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

2) tambahkan ekstensi debug

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

3) Gunakan seperti yang ditunjukkan @Hazarapet Tunanyan

{{ dump(MyVar) }}

atau

{{ dump() }}

atau

{{ dump(MyObject.MyPropertyName) }}
Tudor Ilisoi
sumber
1

Untuk men - debug templat Ranting Anda dapat menggunakan pernyataan debug .

masukkan deskripsi gambar di sini

Di sana Anda dapat mengatur pengaturan debug secara eksplisit.

Raffael
sumber
Saya mendapatkan 'Nama tag tidak dikenal "debug"' dengan dan tanpa pengaturan twig.debug: true
Alexander Morland
jika Anda bekerja dalam mode prod, Anda harus menghapus cache terlebih dahulu
Raffael
@AlexanderMorland Hai Alex, Anda harus memperluas konfigurasi Anda seperti dijelaskan di sini: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 untuk menghilangkan Unknown tag name "debug"kesalahan.
Flu
1

Anda bisa mengedit

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

dan ubah the var_dump()fungsi menjadi\Doctrine\Common\Util\Debug::dump()

pengguna3420644
sumber
3
Mengedit apa pun di bawah folder vendor sangat tidak dianjurkan.
Luis Milanese
1

Karena kebanyakan programmer PHP yang baik suka menggunakan XDebug untuk benar-benar melangkah melalui menjalankan kode dan menonton variabel berubah secara real-time, menggunakan dump()terasa seperti langkah kembali ke masa lalu yang buruk.

Itu sebabnya saya membuat ekstensi Twig Debug dan menaruhnya di Github.

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

composer require delboy1978uk/twig-debug

Kemudian tambahkan ekstensi. Jika Anda tidak menggunakan Symfony, seperti ini:

<?php

use Del\Twig\DebugExtension;

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

Jika ya, seperti ini di layanan Anda konfigurasi YAML:

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

Setelah terdaftar, Anda sekarang dapat melakukan ini di mana saja di templat ranting:

{{ breakpoint() }}

Sekarang, Anda dapat menggunakan XDebug, eksekusi akan berhenti sementara, dan Anda dapat melihat semua properti dari Konteks dan Lingkungan.

Selamat bersenang-senang! :-D

delboy1978uk
sumber
0

Anda dapat menggunakan fungsi dump dan mencetaknya seperti ini

{{ dump(MyVar) }}

tetapi ada satu hal yang menyenangkan juga, jika Anda tidak menetapkan argumen untuk fungsi dump, itu akan mencetak semua variabel yang tersedia , seperti

{{ dump() }}
Hazarapet Tunanyan
sumber
Ya, itu berfungsi, tetapi Anda perlu memastikan debug diaktifkan di opsi saat instantiate Twig
Tudor Ilisoi
0

Jika Anda berada di lingkungan di mana Anda tidak dapat menggunakan dumpfungsi tersebut (mis: opencart), Anda dapat mencoba:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
redochka
sumber