mpp/preventgo-bundle
mpp/preventgo-bundle is a Symfony bundle that packages PreventGo services for quick installation and configuration in Symfony applications, wiring up the required services and settings so you can add its functionality with minimal setup.
Architecture fit. v2.0.1 does not change the headline finding: mpp/preventgo-bundle is a Symfony bundle, and this release is the clearest possible confirmation of that. A patch whose entire content is "Symfony 7 compatibility" tells you the package's compatibility surface is defined by, and moves in lockstep with, Symfony's release cadence — not Laravel's. Bundles ship a Bundle class, a DependencyInjection\Extension, a Configuration tree, and service definitions wired into Symfony's kernel lifecycle. Laravel has no equivalent; it uses service providers, facades, and a config repository. Nothing here is designed to be booted by Illuminate\Foundation\Application. The TPM framing is unchanged and should be restated to stakeholders: this is an API client with a Symfony delivery vehicle. The reusable asset is the HTTP client, request builders, and response DTOs — not the packaging.
Integration feasibility. Still feasible, still a re-homing exercise rather than an install. The three paths remain, in ascending effort and descending risk:
Symfony\Component\HttpClient or the container, this path collapses.Path 2 remains the recommendation. v2.0.1 slightly improves the odds that Path 1 is viable for a quick spike — Symfony 7 alignment implies fewer legacy API usages inside the client — but it does not resolve whether the transport is container-coupled. Keep that as the go/no-go gate.
Technical risk. The headline risk profile is essentially unchanged, but this release adds three data points that a TPM should weigh honestly rather than dismiss:
^6.4|^7.0, this is a clean win and slightly de-risks the composer spike. If it narrows to ^7.0, it silently drops Laravel 10 compatibility and pins us to 11/12. We do not know which, and it matters. Check composer.json before anything else.The underlying weaknesses stand: score in the low 2s, 0 stars, 0 dependents, no external validation, no security disclosure channel, a single point of failure at the vendor, no observable test or coverage signal, and unknown handling of credentials, retries, and idempotency. This remains a first-party SDK built for one consumer's use case, not a package designed for third-party adoption.
Key questions for the vendor / repo review (updated for v2.0.1):
^6.4|^7.0, or ^7.0 only? This single line determines whether Laravel 10 is in or out of scope and is the highest-value thing to read in the repo today.composer.json and deprecation signatures? Review the diff before accepting the "compatibility" framing.Stack fit. Narrow the stated target from "Laravel 10/11/12" to Laravel 11/12 on PHP 8.2+ as the primary target, with Laravel 10 conditional on the constraint question above. This is a change in emphasis, not architecture: v2.0.1 aligns the package with the Symfony 7 component set, which is what Laravel 11/12 already resolve. The recommended shape is unchanged — a first-party PreventGoServiceProvider binding a PreventGoClient interface, a published config/preventgo.php (base URL, credentials, timeout, retry policy), an optional Facade for ergonomics. Transport should be Laravel's Http client or a PSR-18 implementation, not Symfony's HttpClient. Domain objects (screening request, result, status enum) stay plain PHP with no framework imports.
Migration path. No data migration — this is greenfield integration. The "migration" is from Symfony bundle to Laravel-native package, and it remains a deliverable, not glue:
2.0.1, read the #3 diff, strip the DI extension and bundle class, extract the HTTP layer, confirm it runs standalone against a sandbox.If the vendor is unresponsive or the license blocks forking, fall back to Path 3 and use the repo purely as documentation of the wire format. Note that v2.0.1 does not change this fallback — a Symfony 7 fix adds no value to a Laravel-native rewrite, so the fallback cost is unchanged.
Compatibility. The dependency-resolution spike is now the first task, not an early one, and it should be run twice: composer require mpp/preventgo-bundle:2.0.1 into a scratch Laravel 11 app and a scratch Laravel 12 app, then inspect resolution on symfony/http-kernel, symfony/config, symfony/dependency-injection. If the package declares ^7.0 exclusively, expect a clean resolve on 11/12 and a hard conflict on 10. Record the outcome explicitly in the decision log — it is the fact most likely to be misremembered six months from now. Also confirm the package does not register global container behaviour that would be inert-but-confusing under Laravel.
Sequencing.
composer.json at tag 2.0.1 and the #3 diff. Five minutes, and it sets the target matrix.Maintenance. Assume upstream maintenance is low but no longer zero. v2.0.1 is the first evidence of an actively merged change, so the realistic posture is: we own the integration, but the vendor is not entirely absent. Budget accordingly — pin an exact version (2.0.1) or a fork commit SHA, review diffs before any bump, and do not enable Dependabot auto-merge on a package with one maintainer and no security process. v2.0.1 is also a useful cheap test of that process: it is a small diff, so run it through our review workflow now and find out whether the workflow holds before a larger bump forces the question. Ongoing hours are low — small surface area — but permanently ours.
Support. Still no community, no Stack Overflow corpus, no issue-tracker precedent to search. Escalation runs through the commercial relationship with PreventGo, not through GitHub — a merged PR is not a support channel. Confirm that a named contact and SLA exist before the integration lands in a production path.
Scaling. Unchanged. Throughput: the package almost certainly makes synchronous HTTP calls, so anything on a user-facing request path inherits PreventGo's latency and availability. Push screening to queued jobs where the domain allows, set explicit connect/read timeouts, cap retries. Volume: check rate limits early; per-user-per-day is trivial, per-transaction is not. Cache repeat checks (same subject, within a validity window) as both cost and latency control.
Failure modes. Enumerate deliberately — the wrong answer here is a business incident, not a bug:
Error mapping stays first-class in the adapter: VendorUnavailable, VendorRejected, RateLimited, AuthFailed, UnexpectedPayload. Every one logged with correlation IDs and dashboarded.
Ramp-up. Low for a Laravel developer — small codebase, familiar concepts. The real cost is institutional knowledge: with zero public references, the only people who understand this integration are the ones who built it. Write an internal runbook covering credential rotation, vendor contact path, error-code meanings, the pinned version and why, and the fail-open/fail-closed decision per integration point. Assign a named owner. Treat the package as a small piece of proprietary infrastructure rather than an open-source dependency, because that is what it functionally is.
How can I help you explore Laravel packages today?