sigedi/jasper-rest-client
Lightweight PHP/Laravel client for the JasperReports Server REST API. Run reports, pass parameters, select export formats such as PDF, XLSX, and CSV, and handle authentication through a simple, framework-friendly interface. A convenient way to embed JasperReports output in your Laravel applications.
Architecture fit. sigedi/jasper-rest-client remains a thin, framework-agnostic PHP wrapper over the JasperReports Server (JRS) REST API, and 2.0.0 does not change that. There is still no service provider, facade, config file, or queue integration. Its role is unchanged: an outbound adapter translating "give me this report as PDF/XLSX/CSV" into JRS resource lookups, execution, export, and retrieval. The architectural recommendation stands—hide it behind an internal ReportGenerator interface and keep its classes out of controllers and jobs. If anything, the 2.0.0 major bump reinforces this: an adapter boundary is what makes a breaking upgrade a contained change rather than an application-wide one.
Integration feasibility. The mechanical work is still small—install, configure base URL and credentials, wrap in a service provider, bind an interface, smoke-test against a live JRS. What 2.0.0 changes is the compatibility gate, not the effort. The release explicitly adds Symfony 7 support, which in a Laravel context maps to Laravel 11/12-era dependency trees. Two consequences must be checked before any code is written:
Technical risk. The risk profile is marginally improved but structurally unchanged:
Jaspersoft/jrs-rest-php-client were undocumented and un-diffed. We now have a named pull request and an explicit change list for 2.0.0, so the delta is at least inspectable. But that covers the delta within the fork, and the fork-to-upstream delta from 1.0.0 remains unreviewed. This is now a bounded task rather than an unknown: read PR #1 and diff 1.0.0...2.0.0.@vinceAmstoutz) has appeared, and a PR was reviewed and merged. That is the first evidence of any process beyond a single publisher pushing tags. It is one external contributor and one merged PR, so bus factor is still effectively one and there is still no CI badge, no test count, and no release cadence to rely on. Do not upgrade this to "actively maintained" on this evidence.Key questions to resolve before commitment (revised):
composer.json actually constrain—does it drop Symfony 5/6, and what are the PHP and Guzzle minimums?.jrxml report designs?Stack fit. Unchanged in principle: isolate the library in a dedicated Reporting module with its own namespace, config, and tests, and expose domain language ("generate the monthly statement PDF"), not JRS concepts. What changes is the version targeting. 2.0.0's Symfony 7 support aligns it with current Laravel, which is good news for a greenfield integration and a potential blocker for an existing Laravel 10 application. Establish the target stack before choosing the version, not after.
Migration path. The prior recommendation—define a narrow internal interface (submit, poll, fetch, list) and keep library types out of every call site—is now demonstrably correct, because we have an actual breaking release to absorb. Two additions:
"sigedi/jasper-rest-client": "2.0.0" rather than a caret range. With one release per ~18 months and no visible semver discipline, a caret range is a gamble on future behaviour we cannot inspect today.Compatibility. Now a three-way check rather than two: PHP version constraints, the Symfony/Guzzle ranges in composer.json (2.0.0 makes this the decisive check for Laravel version eligibility), and the JRS server version in our environment. Add an assertion-level smoke test that a known report renders and that a report containing accented and CJK characters round-trips correctly—the encoding fix is exactly the kind of change that should be locked down by a test rather than trusted.
Sequencing.
composer.json and PR #1. Decide 1.0.0 vs 2.0.0 based on our Laravel version and the nature of the breaking changes. This gates everything below.Maintenance. The maintenance shape is unchanged—little attention to the library, continuous attention to JRS upgrades, report design changes, and source-schema drift—but the outlook is slightly better than assessed previously. A release, a reviewed PR, and a new contributor are the first signs of life since January 2024. That is one data point, not a cadence, and it does not change the planning assumption that we are the maintainers of last resort. Keep the annual decision point: retain the fork, move to upstream, or internalise the client. Note that 2.0.0 arrived roughly 18 months after 1.0.0, so "wait for an upstream fix" is not a viable incident strategy.
Support. Still no vendor. Escalation runs through public Jaspersoft documentation, community forums, and our own engineers. The appearance of a second contributor does not create a support channel—there is no SLA, no issue triage commitment, and no security disclosure process. This remains an explicitly accepted risk with a named internal owner.
Scaling. Unchanged. The client is stateless and cheap; the bottleneck is the JasperReports Server and the report designs. Tune concurrency on the JRS side and mirror it in queue worker counts—adding PHP workers just relocates the queue to the server. Cache identical parameter sets over the same data snapshot ahead of JRS. Plan for reporting as a background workload with an SLA in minutes, not a synchronous page load.
Failure modes to design for and alert on:
Ramp-up. A mid-level PHP developer is productive with this client in under a day; the surface area is small and the REST semantics are conventional. 2.0.0 does not change the real constraint: report authoring—.jrxml design in Jaspersoft Studio, parameter and datasource modelling, layout debugging—is a separate competency measured in weeks to competence. If the team lacks it, delivery is gated by report design, not by this package. Do not confuse "we integrated the client" with "we can ship reports," and do not read a dependency bump as evidence that the surrounding infrastructure problem has been solved.
How can I help you explore Laravel packages today?