Может войдёшь?
Черновики Написать статью Профиль

Создание отчетов в Laravel

report

Доброе время суток, коллеги!

Сегодня я хотел рассказать о своем пакете для генерации отчетов.

Собственно, что означает слово "отчет"?

Возможно, в вашей системе есть административная панель и ей пользуются дотошные администраторы или менеджеры.

Часто они просят вас выгружать статистические данные, возможно в Excel или PDF, может в более извращенный формат файлов.

Для таких вещей многие пользуются этой библиотекой. (Кстати, недавно вышел новый мажорный релиз)

Но остаются такие проблемы как:

  • создание UI
  • оформление структуры
  • архитектура
  • и чтоб все свистело и крутилось
  • а само может?

Да, я решил создать некое решение, сбрасывая часть проблем в этом направлении. Собственно, сам пакет.

(Note) Под собой он использует тот самый Maatwebsite, о котором я написал чуть выше.

Установка

composer require agoalofalife/reports
php artisan reports:install

Подключение UI

В шаблоне blade достаточно вставить

  <body>
    @include('reports::app')
    ...

Cron

На данный момент процессы по генерации отчетов выполняются через cron.

// App\Console\Kernel
use agoalofalife\Reports\Console\ParseReportsCommand;

  $schedule->command(ParseReportsCommand::class)->everyMinute();

Основные предустановки мы совершили, теперь создадим класс для отчета.

php artisan make:report NameReport

Новый класс необходимо добавить в конфигурационный файл config/reports.php

  'reports' => [
          \App\Reports\TestReport::class
    ],

И рассмотрим наш класс более подробно:

<?php
declare(strict_types=1);
namespace App\Reports;

use agoalofalife\Reports\Contracts\HandlerReport;
use agoalofalife\Reports\Report;

class TestReport extends Report implements HandlerReport
{
    /**
     * Disk for filesystem
     * @var string
     */
    public $disk = 'public';

  /**
     * Format export : xls, xlsx, pdf, csv
     * @var string
     */
    public $extension = 'xlsx';

     /**
     * Get file name
     * @return string
     */
    public function getFilename() : string
    {
        return 'TestReport';
    }

    /**
     * Get title report
     * @return string
     */
    public function getTitle() : string
    {
        return 'Test';
    }

    /**
     * Get description report
     * @return string
     */
    public function getDescription() : string
    {
        return 'Description test report';
    }

    /**
     * @param $excel
     * @return bool
     */
    public function handler($excel) : bool
    {
      $excel->sheet('Sheetname', function ($sheet) {
            $sheet->rows(array(
                array('test1', 'test2'),
                array('test3', 'test4')
            ));
        });
      return true;
    }
}
  • Свойство disk это диск, где складируются ваши файлы.
  • Свойство extension, расширение файла
  • Метод getFilename, возвращает название файла
  • Метод getTitle, заголовок в UI
  • Метод getDescription, описание в UI
  • Метод handler получает в аргументе класс из пакета Maatwebsite. Здесь вы генерируете вашу информацию и возвращаете true в случае успеха.

Уведомления

Так же можно получать уведомления, после генерации вашего отчета. Необходимо реализовать интерфейс agoalofalife\Reports\Contracts\NotificationReport.

Пакет использует интерфейс уведомлений из Laravel, если что-то непонятно, обратитесь к официальной документации.

Если он будет вам полезен - значит, все не зря, ну, и спасибо, что уделили немного времени!

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (4)

storozhuk

Отличная статья!

bobanobi4

Статья хорошая, но вот есть такая невкусняшкак производительность данного чуда, когда к примеру хочешь слить ~100k записей, то после небольших игр с данными ложится PHP, так как память кончается, а если сливать данных на 250к, то PHP может попросить и 1,5-2Гб оперативки, что для сервера невкусно зачастую и он може зависнуть (было такое с моим)
P.S. выход использовать другой класс, он проще куда более чем и методов там немного и да (не поддерживает стилизацию ячеек), но зато его можно дописать и с большими объемами справлется очень прекрасно и не жрет оперативку за счет прямого генерирования в Exele-подобный XML
Вот собственно сам класс https://github.com/mk-j/PHP_XLSXWriter, успехов в Excel

agoalofalife

спасибо за комментарий, спустя время как выяснилось ваша библиотека очень пригодилась!

Anubis

Спасибо. Полезный материал и актуальный.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.