Installation:
composer require zaimea/charts
Publish the config (if needed):
php artisan vendor:publish --provider="Zaimea\Charts\ChartsServiceProvider" --tag="config"
First Use Case: Generate a simple line chart in a Blade view:
use Zaimea\Charts\Chart;
$chart = Chart::line()
->title("Monthly Sales")
->labels(["Jan", "Feb", "Mar"])
->values([30, 40, 65]);
Render in Blade:
{!! $chart->render() !!}
Key Files:
config/charts.php (for global defaults)resources/views/vendor/charts/ (custom templates)app/Charts/ (custom chart classes)Data-Driven Charts: Fetch data from Eloquent models or APIs, then pass to chart methods:
$users = User::selectRaw('DATE(created_at) as date, COUNT(*) as count')
->groupBy('date')
->get();
$chart = Chart::bar()
->title("User Signups")
->labels($users->pluck('date'))
->values($users->pluck('count'));
Dynamic Chart Types: Use a helper to switch chart types based on data:
$chartType = request('chart_type', 'line');
$chart = Chart::$chartType()
->data($data);
Reusable Chart Classes:
Extend Zaimea\Charts\Chart for project-specific logic:
namespace App\Charts;
use Zaimea\Charts\Chart;
class SalesChart extends Chart {
public function __construct() {
parent::line()
->title("Sales Overview")
->colors(['#4f46e5', '#10b981']);
}
}
API Integration: Return charts as JSON for SPAs:
return response()->json([
'chart' => Chart::pie()
->title("Revenue by Region")
->data($regions)
->toArray()
]);
mix.js() to load ApexCharts JS/CSS:
mix.js('node_modules/apexcharts/dist/apexcharts.min.js', 'public/js');
Alpine.data('chart', () => ({
updateChart() {
axios.get('/api/chart-data').then(response => {
this.$refs.chart.updateSeries(response.data);
});
}
}));
$chart = Cache::remember("chart_{$key}", now()->addHours(1), function() {
return Chart::line()->data($data);
});
Missing Dependencies:
Ensure apexcharts JS/CSS are loaded after the chart HTML:
{!! $chart->render() !!}
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
Data Mismatch:
Labels/values must match in length. Use ->empty() for zero-length datasets:
$chart->labels($labels)->values($values)->empty();
Configuration Overrides:
Global config in charts.php may conflict with per-chart settings. Use ->config() to override:
$chart->config(['chart' => ['type' => 'bar']]);
Blade Escaping:
Use {{ $chart->render() }} instead of !! if chart data contains user input to prevent XSS.
data-config attribute for the final ApexCharts config.$chart->config(['chart' => ['events' => ['click' => 'console.log("Clicked")']]]);
$chart->reset();
Custom Templates:
Override Blade templates in resources/views/vendor/charts/chart.blade.php:
<div class="custom-chart-container">
{!! $chart->script !!}
</div>
Plugin Support: Register ApexCharts plugins via config:
'plugins' => [
'Zaimea\Charts\Plugins\ExportPlugin',
],
Theming: Use CSS variables for dynamic theming:
$chart->config([
'theme' => [
'--apex-primary' => '#3b82f6',
]
]);
Server-Side Rendering:
For headless environments, use ->toArray() to generate configs:
$chartData = Chart::pie()->data($data)->toArray();
How can I help you explore Laravel packages today?