Installation Add the package via Composer (mirror repo):
composer require chill-project/report
Publish the config (if needed):
php artisan vendor:publish --provider="Chill\ReportBundle\ChillReportBundle" --tag="config"
First Use Case
Generate a basic report (assuming a Report facade or service):
use Chill\ReportBundle\Report;
$report = Report::create()
->setTitle('User Activity')
->addColumn('id', 'ID')
->addColumn('name', 'Username')
->fetchFromModel(\App\Models\User::class)
->render();
Output the result (e.g., CSV, PDF, or HTML):
return $report->toCSV()->download('user_activity.csv');
Key Files to Review
config/chill_report.php (default settings for formats, storage, etc.).src/Chill/ReportBundle/Report.php (core class for report generation).src/Chill/ReportBundle/Service/Renderer/ (format-specific renderers like CSVRenderer, PDFRenderer).Chainable Methods: Use a fluent interface to build reports:
$report = Report::create()
->setTitle('Sales Overview')
->addColumn('product', 'Product Name')
->addColumn('revenue', 'Total Revenue', fn($item) => '$' . number_format($item->revenue))
->filter('date', '>', now()->subMonth())
->fetchFromQuery(\DB::table('orders')->select('product', \DB::raw('SUM(amount) as revenue'))->groupBy('product'))
->render();
Dynamic Data Sources:
fetchFromModel(User::class, ['id', 'name']).fetchFromQuery($builder).fetchFromArray($data).DataFetcher (see Extension Points).Formatting Columns:
->addColumn('created_at', 'Date', fn($date) => $date->format('Y-m-d'))
->addColumn('status', 'Status', fn($status) => ucfirst($status))
return $report->toPDF()->download('report.pdf');
return $report->toHTML()->stream();
$report->toCSV()->saveAs('storage/reports/user_activity.csv');
Define report templates in config or a dedicated service:
// config/chill_report.php
'reports' => [
'user_activity' => [
'title' => 'User Activity Report',
'columns' => [
['field' => 'id', 'label' => 'ID'],
['field' => 'name', 'label' => 'Username'],
],
'model' => \App\Models\User::class,
],
],
Load via:
$report = Report::fromConfig('user_activity')->render();
Report::create()->onRendered(fn($report) => Log::info('Report generated', $report->toArray()));
// app/Console/Commands/GenerateDailyReport.php
public function handle() {
Report::fromConfig('daily_sales')->toCSV()->saveAs('storage/reports/daily.csv');
}
Archived Package Risk:
laravel/framework:^8.0 or ^9.0).Renderer Limitations:
dompdf or tcpdf (not bundled). Install via:
composer require dompdf/dompdf
resources/views/chill_report/. Override defaults by publishing assets:
php artisan vendor:publish --tag="chill-report-views"
Memory Issues:
->fetchFromQuery($query->cursor())
AGPL License:
debug: true in config/chill_report.php to log report generation steps.$data = $report->getData()->toArray();
dd($data);
Renderer interface is implemented for custom formats. Extend AbstractRenderer for new formats.Custom Data Fetchers:
// app/Providers/ReportServiceProvider.php
public function register() {
Report::extend('api', function($report) {
return new ApiDataFetcher($report);
});
}
Usage:
Report::create()->fetchFrom('api', 'https://api.example.com/data');
New Renderers:
// app/Renderers/ExcelRenderer.php
class ExcelRenderer extends AbstractRenderer {
public function render(): void {
Excel::create('Report', function($excel) use ($this) {
$excel->sheet('Report', $this->data);
})->download('report.xlsx');
}
}
Register in config/chill_report.php:
'renderers' => [
'excel' => \App\Renderers\ExcelRenderer::class,
],
Override Defaults:
config/chill_report.php.resources/views/vendor/chill_report/.$report = Report::fromConfig('user_activity')->cacheFor(3600)->render();
cursor() for large datasets to avoid loading all rows into memory.Report facade in tests:
$this->mock(Report::class)->shouldReceive('create')->andReturnSelf()->andReturn($mockReport);
How can I help you explore Laravel packages today?