Семь "трюков" с dd() в Laravel

Источник: «7 "Tricks" With dd() in Laravel»
В этой статье мы поговорим о функции, используемой каждым Laravel разработчиком — dd(). Я покажу различные творческие способы использования dd() в наших приложениях.

1. dd() в Коллекциях

Первый пример относится к Коллекциям. Это также может быть eloquent коллекция из базы данных. В коллекциях можно использовать цепочку dd().

Например, у вас может быть коллекция с map(), filter(), mapWitKeys() и т.д., а в конце — dd() для дампа результата.

collect(['John Doe', 'Jane Doe'])
->map(/* ваш код */)
->filter(/* ваш код */)
->mapWithKeys(/* ваш код */)
->dd();

И в конце дамп результата.

Illuminate\Support\Collection {#287 ▼ // routes/web.php:17
#items: array:1 [▼
0 => "John Doe"
]
#escapeWhenCastingToString: false
}

Ссылка на официальную документацию.

2. dd() в бенчмарке

Начиная с версии Laravel 9.32, появился новый способ тестирования производительности определённых частей приложения. Для таких случаев можно использовать хелпер класс Benchmark.

Benchmark::dd(fn () => User::find(1));

При этом будут получены результаты в миллисекундах.

"8.262ms" // vendor/laravel/framework/src/Illuminate/Support/Benchmark.php:67

Или может потребоваться протестировать различные сценарии. Для этого случая в dd можно передать массив.

Benchmark::dd([
'Scenario 1' => fn () => User::count(), // 0.5 ms
'Scenario 2' => fn () => User::all()->count(), // 20.0 ms
]);

Здесь мы получаем результат в виде массива для обоих сценариев.

array:2 [▼ // vendor/laravel/framework/src/Illuminate/Support/Benchmark.php:67
"Scenario 1" => "7.287ms"
"Scenario 2" => "0.542ms"
]

Ссылка на официальную документацию.

3. dd() для SQL-запросов

До Laravel 10.15 вместо получения записей из БД можно было использовать метод toSql и получать дамп результата.

$users = User::where('is_admin', false)->toSql();
dd($users);

И в результате будет получен sql-запрос, но без привязок.

"select * from `users` where `is_admin` = ?" // routes/web.php:20

Начиная с Laravel 10.15 появились новые методы toRawSql(), dumpRawSql() и ddRawSql(). Поэтому вместо toSql мы можем использовать toRawSql.

$users = User::where('is_admin', false)->toRawSql();
dd($users);

И теперь у нас есть sql-запрос с привязанными значениями.

"select * from `users` where `is_admin` = 0" // routes/web.php:20

Или вместо dd($users) в конце запроса можно использовать ddRawSql.

$users = User::where('is_admin', false)->ddRawSql();

Результат один и тот же.

"select * from `users` where `is_admin` = 0" // vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:3945

Вы можете ознакомиться с pull request на GitHub и с официальной документацией.

4. Несколько переменных

Иногда может потребоваться вывести дамп более чем одной переменной. Для этого достаточно разделить переменные запятой.

$usersCount = User::where('is_admin', false)->count();
$adminsCount = User::where('is_admin', true)->count();
dd($usersCount, $adminsCount);

Результат выведется дважды.

52 // routes/web.php:21

48 // routes/web.php:21

Ссылка на официальную документацию.

5. dump() вместо dd()

Возможны ситуации, когда требуется выгрузить в дамп некоторую информацию без остановки остального выполнения приложения. В таких случаях вместо dd следует использовать dump.

Route::get('/', function () {
$usersCount = User::where('is_admin', false)->count();
$adminsCount = User::where('is_admin', true)->count();
dump($usersCount, $adminsCount);

return view('welcome');
});

В результате загружается вся страница, а дамп выводится наверх.

dump вместо dd
dump() вместо dd()

Ссылка на официальную документацию.

6. Расширение целого объекта

Когда мы выгружаем дамп Eloquent Collection, у нас обычно есть массив элементов.

Коллекция элементов
Коллекция элементов

При клике на стрелку модель отображается, но все остальные значения остаются свёрнутыми.

Раскрытый элемент
Раскрытый элемент

Если необходимо раскрыть всё сразу, кликните на стрелку, удерживая клавишу Ctrl.

Раскрыть весь элемент
Раскрыть весь элемент

7. Вывод дампа из шаблона Blade

Чтобы вывести дамп значений из Blade, есть два способа.

Один из способов — использовать хелпер dd в фигурных скобках.

{{ dd($yourVariable) }}

Второй способ заключается в использовании Blade директивы @dd.

@dd($yourVariable)

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.4: Больше встроенных обработчиков сообщений

Следующая Статья

Контроллеры и их истинное предназначение