hboie/jasper-rest-client
hboie/jasper-rest-client is a PHP/Laravel client for the JasperReports REST API, providing a service provider and facade to generate and export reports and integrate JasperReports into Laravel applications.
Architecture fit. Despite being evaluated in a Laravel context, hboie/jasper-rest-client is not a Laravel package — there is no service provider, facade, config file, or publishable assets. It is a standalone Guzzle-based SDK for the JasperReports Server REST API (authentication, repository browsing, report execution, and report output retrieval). Architecturally it belongs strictly as an infrastructure adapter at the edge of the application, behind an application-owned interface (e.g., a ReportRenderer contract), never called directly from controllers or domain services. That framing is workable; the library is a thin HTTP wrapper, so the blast radius of replacing it later is small if it is properly isolated.
Integration feasibility. Composer-installable and conceptually simple, but feasibility hinges on details that are not visible from the package metadata and must be verified in a spike: declared PHP version range, Guzzle major-version constraint (Laravel 9/10/11 ship Guzzle 7, and older SDKs frequently pin Guzzle 6, which is an immediate conflict), and which JasperReports Server REST API version(s) it targets (v1 is deprecated; v2 is current). Authentication is the other decision point — JasperReports Server supports both session-cookie login and HTTP Basic, and the package's choice affects statelessness, horizontal scaling, and whether SSO-fronted deployments even work.
Technical risk. This is the dominant concern and it is structural, not fixable by configuration:
/rest_v2/reportExecutions → poll status → fetch exports); subtle changes in status payloads or export endpoints across JRS 7/8/9 versions are exactly the kind of thing an unmaintained client will not absorb.Key questions to resolve before committing:
composer.json, and do they intersect with the current Laravel runtime?Verdict: viable as a reference implementation and starting point, not as an unmodified production dependency. Treat it as a fork-on-day-one candidate.
Stack fit. PHP + Guzzle aligns with Laravel's existing HTTP stack, so the runtime footprint is minimal and there is no new language, daemon, or extension to operate. The mismatch is packaging: because it is not a Laravel package, the integration work is a thin in-house layer — a service provider binding a configured client instance, an env-driven config block (base URL, credentials, auth mode, timeouts, TLS settings), and an adapter class implementing an application-owned reporting interface. That layer is roughly a day of work and is the thing that makes the vendor choice reversible.
Migration path. Two scenarios. Greenfield: there is nothing to migrate; the "migration" is really adoption sequencing. Replacing hand-rolled cURL calls or a SOAP-era client: inventory the endpoints currently in use, map each to the library's methods, and keep the old path behind the same interface so cutover is a binding change rather than a code rewrite. In both cases, do not let the library's method signatures leak into calling code.
Compatibility work required. Fork the repository, update composer.json for PHP 8.1–8.3 and Guzzle 7, run PHPStan at a reasonable level, add PHPUnit coverage for response parsing (report status transitions, export payload handling, error mapping), and stand up a contract-test suite against a real JRS sandbox in CI. Without this, adoption is guessing.
Sequencing:
Maintenance. This package will not maintain itself. Budget an explicit, recurring owner — realistically a few hours per quarter for dependency updates plus unbudgeted time whenever JRS is upgraded or a new report output format is required. Treat the fork as first-party code in the repo of record, with the upstream repository tracked only as a reference. If the team cannot commit to that, do not adopt it; write a 300-line Guzzle client against the JRS REST docs instead, which for execution-and-export scope is not much more work and carries no license or abandonment baggage.
Support. There is no upstream support channel, no issue triage, and no security advisory feed. Support is entirely internal, and internal support depends on the team reading Tibco's REST API documentation directly. That is a real but bounded cost — the JRS REST v2 surface is well documented.
Scaling. The client is not the bottleneck; JasperReports Server is. JRS does the rendering, so throughput is governed by JRS cluster capacity, report complexity, and data-source performance. The application-side levers are: queue all report generation, cap worker concurrency to a level JRS can absorb, cache rendered outputs by report-plus-parameters hash with a TTL, and stream large exports to disk rather than buffering them in PHP memory. All of these are application concerns the library does not help with — and a naive synchronous integration will fall over under load precisely because report generation is slow and bursty.
Failure modes to design for:
Ramp-up. Developer ramp-up is low — anyone comfortable with Guzzle and REST can be productive in half a day. The genuine ramp-up cost is domain knowledge: how JRS report execution actually behaves (input controls, async semantics, output formats, repository layout, permissions). That knowledge is not in this package and is not in the README of any package. Plan for one engineer to own the reporting integration end to end and to document it, because with zero community around this library, that person is the support tier.
How can I help you explore Laravel packages today?