gremo/highcharts-bundle
HighchartsBundle integrates Highcharts into Symfony applications, letting you build interactive JavaScript charts from PHP with a fluent, chainable API and Twig helpers. Configure options server-side without writing JavaScript.
Verdict up front: do not adopt this package. It is an archived 2013 Symfony2 bundle with 19 stars and zero dependents. The Laravel/PHP fit is not "poor but workable" — it is structurally nonexistent, and none of the value it offers survives the port.
Architecture fit. The package targets Symfony's Bundle contract: a Bundle subclass, a DependencyInjection extension, service container XML/YAML, and Twig helpers. Laravel has no equivalent concept. A Laravel application cannot autoload a Symfony bundle as a service provider, and the bundle's registration hooks (AppKernel, services.yml) have no counterpart in bootstrap/app.php or a ServiceProvider. Roughly 80% of the package's code is Symfony glue; the genuinely reusable portion is the fluent options builder that assembles a Highcharts configuration array. That is the only asset worth extracting, and it is a few hundred lines.
Integration feasibility. Low, and not because of effort — because of friction at every layer. Last release October 2013 places it in the Symfony 2.3 / PHP 5.3–5.4 era. Expect array() syntax, no scalar type hints, no return types, and Composer constraints (symfony/symfony ~2.x, php >=5.3.3) that will hard-conflict with any modern Laravel install (php ^8.1|^8.2, symfony/* ^6|^7). Installing it in a Laravel 10/11 project will fail dependency resolution before it fails at runtime. There is no Laravel service provider, no Blade directive, no config publishing, and no facade.
Technical risk. Several independent risks stack:
Key questions for the requestor.
series.data, plotOptions restructuring, module system).Stack fit. None as shipped. The correct framing is not "how do we integrate this" but "how cheaply do we reproduce its one good idea in Laravel." That idea — a fluent PHP builder that composes Highcharts options into a serializable array — is worth roughly three to five developer-days to rebuild cleanly, including tests, and it will be PHP 8-native and Laravel-idiomatic by construction.
Migration path. Treat the repository as a reference implementation, not a dependency. Concretely:
Bundle class, DI extension, services.yml, Twig extension.ServiceProvider, a published config file for defaults (theme, colors, chart.type, license-adjacent settings), and a Blade component or @highcharts directive.@json directive rather than string-concatenated JavaScript. This closes the escaping gap in the original and is the single highest-value change relative to the source package.data- attribute or a page-level config object. Keep the PHP side purely declarative.Compatibility. Target PHP 8.1+, Laravel 9–11, Highcharts 11/12. The 2013 code will not run on any of these without rewrite; assume no line survives untranslated except array shapes and option key names.
Sequencing. License decision first — it is a procurement gate, not a technical one, and it can invalidate the whole workstream. Then a one-day spike: render a hardcoded line chart end-to-end through Blade + Vite + Highcharts 12 to prove the pipeline. Then port the builder incrementally, driven by two or three real chart requirements rather than the full options surface. Do not build a general-purpose abstraction up front; grow it against actual usage. Add the Export Server only if a hard requirement for PNG/PDF exists, and treat it as separate infrastructure with its own ticket.
Maintenance. We own it permanently. That is acceptable for a 300-line internal package and unacceptable for a forked abandoned dependency. The distinction matters: forking gremo/highcharts-bundle means inheriting Symfony-shaped code we must keep patching around Laravel. Reimplementing the pattern means owning code shaped for our conventions. Choose the second.
Support. Zero vendor support, zero community. With 19 stars and 0 dependents there is effectively no one else running this code in 2024+. Any incident is resolved entirely in-house, and internal documentation becomes the only knowledge base — budget for it explicitly, or the package becomes tribal knowledge concentrated in one developer.
Scaling. Server-side config generation is cheap and will not be the bottleneck; it is pure array assembly with no I/O. The scaling concerns are client-side and data-volume: large series payloads inflate response size, chart count per page multiplies browser render cost, and Highcharts' client rendering degrades with tens of thousands of points. Mitigations are decimation (dataGrouping), server-side aggregation endpoints returning downsampled series, and lazy-loading charts below the fold. None of these are addressed by the bundle and all of them will surface in production.
Failure modes. Ranked by likelihood:
Ramp-up. For a mid-level Laravel developer, the package's own code is readable in under a day — it is small and dull. The real ramp is the Highcharts options API, which is large, under-documented at the edges, and the actual source of defects. That ramp cost is identical whether we adopt the bundle, fork it, or reimplement the pattern, which further weakens the case for carrying the dependency. Net recommendation: reject the package, budget three to five days for an internal Blade-native equivalent, and resolve the Highcharts commercial license before any code is written.
How can I help you explore Laravel packages today?