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