Installation Add the package via Composer:
composer require brown298/reportbuilderbundle
Register the bundle in config/app.php under providers:
Brown298\ReportBuilderBundle\ReportBuilderBundle::class,
First Use Case: Basic Report Generation
php artisan vendor:publish --provider="Brown298\ReportBuilderBundle\ReportBuilderBundle" --tag="config"
use Brown298\ReportBuilderBundle\ReportBuilder;
public function generateReport()
{
$report = new ReportBuilder();
$report->setTitle('Sample Report')
->addColumn('ID', 'id')
->addColumn('Name', 'name')
->setDataSource($this->fetchDataFromDatabase())
->generate('pdf', 'storage/app/reports/sample.pdf');
}
Where to Look First
config/reportbuilder.php for default settings (e.g., output formats, storage paths).README.md in the repository for API references and examples.ReportBuilderBundle) for registered services (e.g., ReportBuilder, ReportRenderer).Dynamic Report Generation
Use the ReportBuilder class to construct reports programmatically:
$report = new ReportBuilder();
$report->setTitle($request->input('title'))
->addColumn($request->input('column_name'), 'column_key')
->setDataSource($this->getFilteredData($request->all()))
->generate($request->input('format'), $outputPath);
Reusable Report Templates
Extend the ReportBuilder class to create domain-specific report builders:
class SalesReportBuilder extends ReportBuilder
{
public function __construct()
{
$this->setTitle('Monthly Sales Report')
->addColumn('Product', 'product_name')
->addColumn('Revenue', 'revenue', 'currency')
->setDefaultFormat('xlsx');
}
}
Integration with Laravel Views Render reports as HTML for inline preview or email attachments:
$html = $report->generate('html');
return new Response($html);
// Or send via Mail:
Mail::send([], [], function ($message) use ($html) {
$message->subject('Your Report')
->setBody($html, 'text/html');
});
Data Source Flexibility Support Eloquent models, collections, or raw arrays:
// Eloquent Model
$report->setDataSource(User::where('active', 1)->get());
// Raw Array
$report->setDataSource([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Jane'],
]);
Scheduled Reports Use Laravel’s task scheduling to generate reports periodically:
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
$report = new ReportBuilder();
$report->setDataSource($this->getDailySales())
->generate('pdf', 'storage/app/reports/daily_sales.pdf');
})->daily();
}
storage_path() or custom paths in config/reportbuilder.php for output files.dompdf (for PDF) or phpoffice/phpspreadsheet (for Excel) is installed if using those formats.$cacheKey = 'report_' . md5($request->input());
$reportData = Cache::remember($cacheKey, now()->addHours(1), function () use ($report) {
return $report->generate('pdf');
});
Format-Specific Dependencies
dompdf/dompdf. Install via:
composer require dompdf/dompdf
phpoffice/phpspreadsheet. Install via:
composer require phpoffice/phpspreadsheet
storage/logs/laravel.log for missing dependencies.Data Source Mismatches
setDataSource():
$data = $this->validateReportData($rawData);
$report->setDataSource($data);
Memory Limits
Allowed memory size exhausted).memory_limit in php.ini.Configuration Overrides
php artisan config:clear
config/reportbuilder.php to log generation steps:
'debug' => env('APP_DEBUG', false),
try {
$report->generate('pdf', $path);
} catch (\Exception $e) {
Log::error('Report generation failed: ' . $e->getMessage());
throw $e;
}
Custom Renderers
Extend the ReportRenderer interface to support new formats (e.g., CSV, JSON):
class CustomRenderer implements ReportRenderer
{
public function render(array $data, string $format): string
{
// Custom logic (e.g., JSON serialization)
return json_encode($data);
}
}
Register the renderer in the bundle’s service provider.
Column Formatting Override column rendering via a callback:
$report->addColumn('Price', 'price', null, function ($value) {
return '$' . number_format($value, 2);
});
Event Listeners
Listen for report generation events (e.g., ReportGenerating, ReportGenerated) to log or modify reports:
// In a service provider
$this->app->booted(function () {
event(new ReportGenerating($report));
});
Localization
Support multi-language reports by overriding the setTitle() and column labels dynamically:
$report->setTitle(__('report.title'))
->addColumn(__('report.columns.name'), 'name');
How can I help you explore Laravel packages today?