Статьи

Больше нет var_dump — Представляем Symfony VarDumper!

Недавно Symfony прошел путь от Zend-подобного раздувания и жесткости до крайней развязки и модульности. С новой инициативой Developer Experience Symfony сделал 180-градусный стиль Laravel и полностью погрузился в то, чтобы сделать его компоненты более удобными для конечного пользователя, более полными документами и разделить AppBundles , упрощая ввод и дальнейшее развитие почти в геометрической прогрессии. Учитывая удобство для пользователя, он далек от «лучшего друга», но определенно больше не враждебен. Одним из факторов, способствующих этому фактору, является их постоянное выталкивание новых компонентов, которые невероятно полезны вне контекста Symfony. Одним из таких компонентов является новый VarDumper .

Symfony-логотип

Почему?

Вы разрабатываете функцию. Вам либо не хочется писать тесты, либо то, что вы разрабатываете, нуждается в переменном тестировании в середине функции — что-то, что вы не можете полностью охватить тестом. Неизбежно, вы прибегаете к чему-то вроде die(var_dump($var)); , Даже если вы абстрагировали его в сокращенный метод, такой как vddd($var)

У нас мало выбора — иногда нам просто нужны наши vddd И, конечно же, если вы являетесь пользователем Xdebug, вы, вероятно, привыкли к немного более привлекательному выводу, чем необработанные отпечатки PHP. Тем не менее, существует несколько хороших решений, которые украсили бы этот вывод для нас настолько, чтобы стоило установить зависимость от dev. До VarDumper.

Что такое VarDumper?

Symfony VarDumper — это компонент, разработанный для замены ваших var_dump По сути, он выполняет те же функции, но предоставляет вам гораздо больше информации в гораздо более привлекательном формате. Это var_dump

Согласно их документации , используя его, вы получите:

  • По объектам и типам ресурсов специализированное представление, например, для фильтрации внутренних элементов Doctrine при выгрузке одного прокси-объекта или получения более подробной информации об открытых файлах с помощью stream_get_meta_data;
  • Настраиваемые форматы вывода: HTML или цветной вывод из командной строки;
  • Возможность выгрузки внутренних ссылок, как мягких (объекты или ресурсы), так и жестких (= & для массивов или свойств объектов). Повторные вхождения одного и того же объекта / массива / ресурса больше не будут появляться снова и снова. Кроме того, вы сможете проверить ссылочную структуру ваших данных;
  • Способность работать в контексте обработчика буферизации вывода.

Установка и использование

Давайте быстро установим его в наш экземпляр Homestead Improved и проведем пару тестов. Если вы еще не знакомы с HI, потратьте 5 минут, чтобы покончить с этим, чтобы вы могли следить за тестами.

Установка

Как и в любом приличном современном проекте PHP, установка так же проста, как запуск

 composer require symfony/var-dumper

Примеры использования

Он используется через недавно выставленную функцию dump

 $var1 = "test";

dump($var1);

01

Давайте попробуем что-то более сложное сейчас.

 $a = [
    'ak1' => 'av1',
    'ak2' => 'av2',
    'ak3' => 'av3',
    'ak4' => 'av4',
    'ak5' => 'av5',
];

$b = [
    'bk1' => 'bv1',
    'bk2' => 'bv2',
    'bk3' => 'bv3',
    'bk4' => 'bv4',
    'bk5' => 'bv5',
];

$object = new \stdClass();
$object->prop1 = 10;
$object->prop2 = 20;
$object->prop3 = 30;
$object->prop4 = 40;

$c = [
    'a' => &$a,
    'b' => $b,
    $object
];

dump($c);

01

Как вы можете видеть, VarDumper чудесным образом экспортирует переменные, которые мы определили, объявляя все подробно — все в сочетании с неким практичным CSS, который не только выделяет синтаксис, но и позволяет нам расширять и сворачивать различные части дампа данных. Хм, а что это за плюсы рядом со свойствами stdObject Публичные свойства? Как он отображает частные? Есть ли это вообще? Посмотрим.

 class Test {
    public $prop1 = 10;
    private $prop2 = 20;
    protected $prop3 = 30;
    private $prop4 = 40;

    public function __construct($value) {
        $this->undefinedProp = $value;
    }
}

$t = new Test(50);

dump($t);

02

Таким образом, открытые свойства — это плюсы, частные — минусы, защищенные — хэши, аккуратные. И не только это, но каждое свойство в дампе также имеет подсказку заголовка, которая предоставляет дополнительную информацию, когда вы наводите на них курсор мыши:

02

Более того, добавленные во время выполнения свойства специально определены как в подсказке, так и визуально — они заключены в кавычки.

Что насчет добавленных во время выполнения методов? Посмотрим.

 class Test {
    public $m1;
    protected $m2;

    public function __construct() {
        $this->m2 = function() {
            return "I'm method 2";
        };
    }

    public function buildFunction() {
        $this->m3 = function() {
            return "I'm method 3";
        };
    }

    public function __call($method, $args)
    {
        if (isset($this->$method)) {
            $func = $this->$method;
            return call_user_func_array($func, $args);
        }
    }

}

$t = new Test();
$m1 = function() {
    return "I'm method 1";
};
$t->m1 = $m1;
$t->buildFunction();
$t->m1();

dump($t);

03

Вы можете видеть, что VarDumper предоставляет гораздо больше информации об объектах, используя отражение, чем типичный var_dump — даже строки кода, где определены методы.

Это лишь некоторые из хитрых трюков, которые VarDumper имеет в рукаве — для остальных, а также скриншоты того, как они выглядят, ознакомьтесь с объявлением .

Вывод

VarDumper — отличный инструмент для быстрой и грязной проверки безопасности и работоспособности, и при использовании вместе с DebugBundle Symfony он становится еще более мощным — фактически он включен по умолчанию в версии dev и отладки установок Symfony, начиная с версии 2.6 и далее.

Некоторые могут возразить, что использование его с простой командой dump() Хотя изменяемое имя функции для вызова утилиты может успокоить эти обеспокоенные умы, я полагаю, что здесь мы имеем дело с очень элементарной и незначительной для производства функциональностью, и, таким образом, эта не проблема может быть прощена.

Теперь, когда вы знаете о VarDumper, будете ли вы добавлять его в свои собственные проекты для отладки на лету?