Все эти статьи в духе «Создание отчётов в Laravel за 5 минут» вызывают у меня ту же реакцию, что и советы «выйди из зоны комфорта» — хочется выбросить ноутбук в окно вместе с автором. Отчёты — это не про «пять минут», а про то, что тебя заё… ну, утомляет, но всё равно приходится делать. Руководство хочет «цифры в Excel», бухгалтерия «PDF с печатью», маркетинг «графики на дашборде». А ты сидишь и думаешь: чем бы быстрее отстреляться, чтобы тебя снова не припахали.

В общем, давай рассмотрим какие способы работают в Laravel и когда стоит юзать один вместо другого.

Blade и PDF через Dompdf

Самый ленивый способ — взять Blade-шаблон, влепить туда таблицу и скормить это всё Dompdf. Работает в 80% случаев, когда нужен тупой отчёт с табличкой.

public function generateReport()
{
    $data = [
        'title' => 'Отчёт о продажах',
        'sales' => Sale::all(),
    ];

    $pdf = PDF::loadView('reports.sales', $data);
    return $pdf->download('sales_report.pdf');
}

Да, Dompdf иногда роняет верстку так, что хочется вызвать экзорциста, но если без изысков и без Flexbox — жить можно. Короче, отчёт для начальника «посмотреть цифры» — норм вариант.

Excel через Laravel Excel

Когда у тебя на горизонте бухгалтерия или «аналитики» (те самые ребята, которые любят крутить таблицы на три листа в ширину) — забудь про PDF. Excel рулит.

use Maatwebsite\Excel\Facades\Excel;
use App\Exports\SalesExport;

public function exportSales()
{
    return Excel::download(new SalesExport, 'sales.xlsx');
}

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

Snappy и wkhtmltopdf

Dompdf тебя бесит, шрифты пляшут, таблицы кривые — значит пора ставить Snappy. Это обёртка над wkhtmltopdf. Тот самый инструмент, который рендерит HTML в PDF с почти реальной версткой. Почти.

use Knp\Snappy\Pdf;

public function generatePdfReport()
{
    $snappy = new Pdf('/usr/local/bin/wkhtmltopdf');
    $html = view('reports.sales', ['sales' => Sale::all()])->render();
    $pdf = $snappy->getOutputFromHtml($html);

    return response($pdf, 200, [
        'Content-Type' => 'application/pdf',
        'Content-Disposition' => 'attachment; filename="sales_report.pdf"',
    ]);
}

Минус — ставить wkhtmltopdf на сервер, где крутится Laravel. Если это какой-нибудь shared-хостинг — забудь, без рута не поставишь. На нормальном сервере — ставится и пашет. Вёрстка сохраняется почти один в один, не нужно плясать с костылями.

Когда что юзать

  • Blade + Dompdf — отчёт для руководителя: простая таблица, скачать и забыть.
  • Laravel Excel — бухгалтерия и аналитики, которые любят всё крутить в Excel.
  • Snappy (wkhtmltopdf) — когда нужен красивый PDF без убогих костылей.

По сути, на проекте почти всегда ставишь Laravel Excel, или на крайняк Snappy. Dompdf — для «сделать быстро и дешево».

Заключение

Создание отчётов в Laravel — это не выбор между «правильно» и «неправильно». Это выбор между «сделать быстро» и «сделать так, чтобы не материться через неделю». И вот если хочешь не материться — сразу бери Laravel Excel для выгрузок и Snappy для PDF.