Làm thế nào để biến var_dump trong các mẫu twig?


156

Xem mẫu lớp nơi bạn chỉ trình bày những gì bạn đã được cung cấp là tốt và tất cả, nhưng làm thế nào để bạn biết những gì có sẵn? Có chức năng "liệt kê tất cả các biến được xác định" trong TWIG không? Có cách nào để biến một biến?

Giải pháp tôi tìm thấy bằng cách tìm kiếm nó là xác định một hàm trong đó tôi có thể sử dụng các công cụ gỡ lỗi php hiện có của mình bằng cách tiêm một hàm , nhưng tất cả các tham chiếu mà tôi đã tìm thấy bao gồm hai dòng mã đẹp này, nhưng không nơi nào được chỉ định ở đâu đặt chúng. Thực tế là họ cần một biến $ loader được xác định, tôi đã thử /app/config/autoload.php nhưng trình tải $ có loại sai. Tôi đặt mã php ở đâu để thêm chức năng twig?

Câu trả lời:


251

Kể từ Twig 1.5, câu trả lời đúng là sử dụng chức năng kết xuất. Nó được ghi lại đầy đủ trong tài liệu Twig . Đây là tài liệu để kích hoạt tính năng này trong Symfony2.

{{ dump(user) }}

3
BTW, hãy cẩn thận khi đổ các đối tượng có ánh xạ quan hệ
pleerock

14
Khi tôi sử dụng {{ dump() }}để kết xuất tất cả các biến, nó trả về một trang trống. Có cách nào khác để kết xuất một biến không?
Jerry Phạm

Tôi đang sử dụng phiên bản mới nhất của Symfony 2.5 và có chế độ gỡ lỗi và cài đặt config.yml và config_dev.yml được bật khi tải kernel cho môi trường dev. Tôi đã thử các phương pháp thủ công khác được đề cập bởi Morland bên dưới. Dù bằng cách nào, tôi cũng nhận được một trang trống khi sử dụng kết xuất. Và không có bãi rác.
Chadwick Meyer

Nếu bạn nhận được một trang trống có và không có dump, rõ ràng đó dumpkhông phải là vấn đề. Tôi sẽ đề nghị đăng một câu hỏi mới nếu bạn không thể tìm ra câu hỏi khác.
Icode4food

1
Tôi nhận được lỗi sau: `Twig_Error_Syntax - Unknown "dump" function`
Pha-trốt

28

Bạn có thể sử dụng debugthẻ, được ghi lại ở đây .

{% debug expression.varname %}

Chỉnh sửa: Kể từ Twig 1.5, điều này đã không được chấp nhận và được thay thế bằng dumpchức năng mới (lưu ý, giờ đây nó là một chức năng và không còn là thẻ). Xem thêm: Câu trả lời được chấp nhận ở trên.


7
Nếu bạn gặp lỗi khi nói Unknown tag name "debug", hãy mở rộng cấu hình của bạn (trong toàn cầu config.ymlhoặc config_dev.yml) như được mô tả ở đây: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861
cúm

5
Phương pháp này không được chấp nhận kể từ Twig 1.5.
Icode4food

4
Đã thêm một ghi chú khấu hao vào câu trả lời.
igorw

17

Vì vậy, tôi đã làm cho nó hoạt động, một phần hơi hackish:

  1. Bộ twig: debug: 1 trongapp/config/config.yml
  2. Thêm phần này vào config_dev.yml

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

  4. Để sử dụng chức năng gỡ lỗi của riêng tôi thay vì print_r(), tôi đã mở vendor/twig-extensions/lib/Twig/Extensions/Node/Debug.phpvà thay đổi print_r(thànhd(

Tái bút Tôi vẫn muốn biết làm thế nào / nơi để lấy môi trường $ twig để thêm bộ lọc và tiện ích mở rộng.


1
btw: để xóa bộ nhớ cache, bạn có thể sử dụng công cụ bảng điều khiển ( stackoverflow.com/questions/6789950/ mẹo )
Raffael

Có bất kỳ lợi thế để làm điều đó?
Alexander Morland

nó đơn giản hơn ... nếu bạn không biết công cụ điều khiển, tôi khuyên bạn nên kiểm tra nó
Raffael

3
Bạn không cần phải thiết lập twig: debug: 1vì nó kế thừa thông tin này từ môi trường của bộ điều khiển trước của bạn. Nếu không, bạn có thể vô tình xuất ra thông tin gỡ lỗi trong môi trường prod của bạn. Miễn là bạn đang làm việc trong môi trường dev, nó được bật theo mặc định và nó bị vô hiệu hóa trong môi trường prod của bạn.
cúm

1
Điều này đã lỗi thời kể từ Twig 1.5. Xem câu trả lời khác: stackoverflow.com/a/10080404/107768
Icode4food

14

Nếu bạn đang sử dụng Twig trong ứng dụng của mình làm thành phần, bạn có thể thực hiện việc này:

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

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

Sau đó, trong các mẫu của bạn:

{{ my_variable | var_dump }}

Nơi để đặt / thay thế những người $twig = new Twig_Environment($loader, array(...?
PolGpson

5

Nếu bạn đang sử dụng Twig như một thành phần độc lập thì đây là một số ví dụ về cách bật gỡ lỗi vì không chắc là hàm dump (biến) sẽ hoạt động ngay lập tức

Độc lập

Điều này đã được tìm thấy trên liên kết được cung cấp bởi 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

Kết xuất tất cả các biến tùy chỉnh:

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

Bạn có thể sử dụng plugin của tôi để làm điều đó cho bạn (một định dạng độc đáo đầu ra):

Thanh Twig


đoạn trích hay. cảm ơn bạn. điều này làm việc cho tôi nếu tôi thay thế dump (value) bằng value | var_dump
matthijs koevoets

3

{{ dump() }}không làm việc cho tôi. PHPcuộn cảm. Tôi đoán mức độ làm tổ quá sâu.

Tất cả những gì bạn thực sự cần đến debugTwig mẫu nếu bạn đang sử dụng một debuggertiện ích mở rộng như thế này .

Sau đó, chỉ là vấn đề đặt điểm dừng và gọi {{ inspect() }}bất cứ nơi nào bạn cần. Bạn nhận được thông tin giống như với {{ dump() }}nhưng trong trình gỡ lỗi của bạn.


3

Vì Symfony> = 2.6, có một thành phần VarDumper đẹp , nhưng nó không được Twig's sử dụngdump() chức năng .

Để ghi đè lên nó, chúng ta có thể tạo một phần mở rộng:

Trong triển khai sau, đừng quên thay thế các không gian tên.

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

}

Có, tôi đang tìm cái này :)
Tim Strijdhorst

2

Công thức hoàn chỉnh ở đây để tham khảo nhanh hơn (lưu ý rằng tất cả các bước là bắt buộc):

1) khi khởi tạo Twig, vượt qua tùy chọn gỡ lỗi

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

2) thêm phần mở rộng gỡ lỗi

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

3) Sử dụng nó như @Hazarapet Tunanyan chỉ ra

{{ dump(MyVar) }}

hoặc là

{{ dump() }}

hoặc là

{{ dump(MyObject.MyPropertyName) }}

1

Để gỡ lỗi các mẫu Twig, bạn có thể sử dụng câu lệnh gỡ lỗi .

nhập mô tả hình ảnh ở đây

Ở đó bạn có thể thiết lập cài đặt gỡ lỗi một cách rõ ràng.


Tôi nhận được 'Tên thẻ không xác định "gỡ lỗi"' có và không cài đặt twig.debug: true
Alexander Morland

nếu bạn đang làm việc ở chế độ prod, trước tiên bạn phải xóa bộ đệm
Raffael

@AlexanderMorland Xin chào Alex, bạn phải mở rộng cấu hình của mình như được mô tả ở đây: github.com/symfony/symfony-docs/issues/455#issuecomment-1884861 để thoát khỏi Unknown tag name "debug"lỗi.
cúm

1

Bạn có thể chỉnh sửa

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

và thay đổi the var_dump()chức năng thành\Doctrine\Common\Util\Debug::dump()


3
Chỉnh sửa bất cứ điều gì trong thư mục nhà cung cấp là không khuyến khích.
Luis Milanese

1

Vì hầu hết các lập trình viên PHP giỏi thích sử dụng XDebug để thực sự bước qua việc chạy mã và xem các biến số thay đổi theo thời gian thực, sử dụng dump()cảm giác như một bước lùi về thời kỳ tồi tệ cũ.

Đó là lý do tại sao tôi thực hiện tiện ích mở rộng Twig Debug và đưa nó lên Github.

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

composer require delboy1978uk/twig-debug

Sau đó thêm phần mở rộng. Nếu bạn không sử dụng Symfony, như thế này:

<?php

use Del\Twig\DebugExtension;

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

Nếu bạn là như thế này trong dịch vụ của bạn cấu hình YAML:

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

Sau khi đăng ký, bây giờ bạn có thể thực hiện việc này ở bất cứ đâu trong mẫu twig:

{{ breakpoint() }}

Bây giờ, bạn có thể sử dụng XDebug, thực thi sẽ tạm dừng và bạn có thể thấy tất cả các thuộc tính của cả Bối cảnh và Môi trường.

Chúc vui vẻ! : -D


0

bạn có thể sử dụng chức năng kết xuất và in nó như thế này

{{ dump(MyVar) }}

nhưng cũng có một điều hay, nếu bạn không đặt bất kỳ đối số nào thành hàm kết xuất, nó sẽ in tất cả các biến có sẵn , như

{{ dump() }}

Có, nó hoạt động, nhưng bạn cần đảm bảo gỡ lỗi được bật trong các tùy chọn khi khởi tạo Twig
Tudor Ilisoi

0

Nếu bạn đang ở trong một môi trường mà bạn không thể sử dụng dumpchức năng (ví dụ: opencart), bạn có thể thử:

{{ my_variable | json_encode(constant('JSON_PRETTY_PRINT')) }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.