Installation:
composer require ob/highcharts-bundle
Enable the bundle in config/bundles.php:
return [
// ...
Ob\HighchartsBundle\ObHighchartsBundle::class => ['all' => true],
];
First Chart in Twig:
{{ render_highchart({
'type': 'line',
'title': { 'text': 'Sample Chart' },
'series': [{
'name': 'Data',
'data': [1, 2, 3, 4, 5]
}]
}) }}
Key Files to Review:
Resources/doc/usage.md (core usage patterns)Resources/doc/cookbook.md (practical examples)Resources/doc/installation.md (Symfony 5/6 compatibility notes)// Controller
public function salesChartAction()
{
$data = [100, 200, 150, 300, 250]; // From DB or service
return $this->render('chart.html.twig', [
'chartData' => $data
]);
}
// Twig
{{ render_highchart({
'type': 'column',
'series': [{
'name': 'Sales',
'data': chartData
}]
}) }}
Define Chart Structure in PHP:
use Ob\HighchartsBundle\Highcharts\Highchart;
$chart = new Highchart();
$chart->chart->type('line')
->title('Monthly Visits')
->series([
new \Ob\HighchartsBundle\Highcharts\Series([
'name' => 'Users',
'data' => [10, 20, 15, 30, 45]
])
]);
Twig Integration:
{{ render_highchart(chart) }}
$chart->series([['data' => [1, 2, 3]]]);
$data = $entityRepository->getMonthlyStats();
$chart->series([['data' => array_column($data, 'value')]]);
Create a Chart Builder Service:
// src/Service/ChartBuilder.php
class ChartBuilder {
public function buildSalesChart(array $data): Highchart {
$chart = new Highchart();
$chart->chart->type('column')
->title('Sales Overview');
$chart->series([['name' => 'Revenue', 'data' => $data]]);
return $chart;
}
}
Use in Controller:
$chart = $this->get('chart_builder')->buildSalesChart($salesData);
return $this->render('dashboard.html.twig', ['chart' => $chart]);
// Frontend JS
$.get('/api/sales-data', function(data) {
Highcharts.chart('container', {
series: [{
data: data
}]
});
});
Pair with Symfony’s JsonResponse:
return new JsonResponse($data);
{% set highchartsOptions = {
'lang': {
'noData': 'Loading data...'
},
'colors': ['#3f51b5', '#ff5722']
} %}
{{ render_highchart(chart, highchartsOptions) }}
Twig vs. PHP Configuration:
Highchart, Series) for complex charts; use Twig for simple overrides.{# Avoid this for complex charts #}
{{ render_highchart({
'series': [{'data': complex_data_logic_here}]
}) }}
Highcharts JS Version Mismatch:
<script src="https://code.highcharts.com/highcharts.js"></script>
Caching Static Charts:
cache: false in Twig or clear cache when data changes:
{{ render_highchart(chart, {'cache': false}) }}
Inspect Generated JSON:
data-highcharts-options attribute on rendered <div> elements.console.log(document.querySelector('[data-highcharts-options]').dataset.highchartsOptions);
Validate Highcharts API:
Symfony Debug Toolbar:
ObHighchartsBundle's profiler data (if supported) to inspect chart generation.Custom Series Types:
Ob\HighchartsBundle\Highcharts\Series for domain-specific logic:
class CustomSeries extends Series {
public function setCustomProperty($key, $value) {
$this->options[$key] = $value;
}
}
Override Twig Rendering:
// src/Twig/Extension/CustomHighchartsExtension.php
class CustomHighchartsExtension extends \Twig_Extension {
public function getFunctions() {
return [
new \Twig_SimpleFunction('render_custom_chart', [$this, 'renderChart']),
];
}
}
Integrate with Doctrine:
Ob\HighchartsBundle\Highcharts\Data\DataProviderInterface to fetch data from repositories:
$chart->series([new Series([
'data' => $this->getDoctrine()->getRepository(MyEntity::class)->getChartData()
])]);
Large Datasets:
turboThreshold for performance:
$chart->chart->turboThreshold(1000);
Lazy Loading:
{# app.js #}
require(['https://code.highcharts.com/highcharts.js'], function(Highcharts) {
// Initialize charts
});
Default Options:
config/packages/ob_highcharts.yaml:
ob_highcharts:
default_options:
chart:
type: 'line'
plotOptions:
series:
animation: false
Localization:
$chart->lang->noData('No data available for this period.');
How can I help you explore Laravel packages today?