keirontw/relay-point-bundle
A PHP bundle for adding relay point and pickup location support to your application. It provides configuration and service integration for shipping, checkout, and delivery workflows, making it easier to manage selectable parcel pickup points.
What this actually is. Despite being requested as a Laravel/PHP package assessment, v1.0.0 is a pure Symfony bundle — no Laravel support is claimed, and the release notes explicitly position it as framework-agnostic with "no e-commerce framework required." That distinction is the single most important finding for a TPM: the package solves a real, expensive problem (relay-point / pickup-point selection across 12 carriers) but does not drop into a Laravel application.
Architecture fit. The design is clean and appropriately decomposed for a TPM's purposes: carrier logic sits behind RelayPointProviderInterface with auto-discovery, so adding or swapping carriers is a configuration-plus-class exercise rather than a fork. Geocoding is similarly pluggable (Addok, Nominatim, Google Maps, Photon, custom), which matters because geocoding is the cost and compliance hotspot in this domain. Critically, selection state is session-backed and deliberately decoupled from any Order/cart model — good for portability, but it means the package stops short of the thing most businesses actually need: reliably attaching a relay point to an order at checkout. That last mile is only partially covered by the optional generic checkout listener (checkout_listener.enabled + event_class), which assumes a Symfony event dispatcher.
Integration feasibility (Laravel). Low as shipped. The bundle's value-added wiring — Twig block overrides, Stimulus widget, AssetMapper auto-registration, Symfony session, Symfony event dispatcher — is all scaffolding a Laravel app cannot consume. A viable path exists only if the carrier/geocoding domain classes are free of HttpKernel and Twig coupling and can be instantiated inside a hand-written Laravel service provider. That is an assumption to verify in a spike, not a documented capability.
Technical risk.
keirontw while the README URL points at BastienMesnil/relay-point-bundle. Confirm this is the same maintainer and not a namespace squat before composer require anywhere near production.Key questions for the maintainer/vendor.
Stack fit. If the organisation is genuinely on Symfony (with Twig + Stimulus UX, optionally AssetMapper), this is close to turnkey and the assessment is simple: pilot it. If the stack is Laravel, treat this as a domain reference implementation and carrier-integration library, not an installable dependency. The reusable value is the provider interface, the carrier adapters, and the geocoder abstractions — not the bundle.
Migration path. There is no prior release, so no upgrade migration exists. The realistic migration is from whatever is in place today (typically a bespoke Mondial Relay iframe or a single-carrier widget). Recommended path:
@vite or Livewire in place of Twig/Stimulus — and re-implement the checkout listener against Laravel events/jobs rather than Symfony's dispatcher.Compatibility. Unknown until answered: PHP constraint, Symfony constraint, and whether symfony/asset-mapper is optional or effectively required for the widget. Session semantics differ materially (Symfony SessionInterface vs Laravel's session store), as does event dispatch. Treat both as adapter code you own.
Sequencing. Carrier integration and geocoding are the long-lead, externally blocked items — validate carrier credentials and API access first, before committing to the UI rework. Geocoder selection should follow (Nominatim's usage policy and Google Maps' billing model have very different operational consequences). Presentation/checkout wiring last, since it is the part most likely to be rewritten regardless.
Maintenance. Budget for carrier API drift as a standing cost, not a one-off: 12 integrations means an ongoing watch cycle, and the maintainer may not absorb breaking carrier changes promptly. Pin the version, maintain a fork or patch queue, and consider limiting launch scope to the 2–3 carriers that carry real volume rather than enabling all twelve.
Support. Single-maintainer, first release, no published SLA or security process. For a checkout-critical dependency, plan for internal ownership: someone on the team must be able to read and patch the carrier adapters. Escalation to upstream should be treated as best-effort.
Scaling. Two concrete concerns: (1) session-backed selection does not survive horizontally unless the session store is shared and sticky-session-free — verify before load testing; (2) geocoding calls in the selection path are latency- and quota-sensitive, so a cache layer and a timeout-plus-fallback are mandatory. Carrier API calls during checkout should be async or pre-warmed; a synchronous multi-carrier fan-out will show up directly in conversion.
Failure modes and mitigations.
composer.json with a commit or tag constraint.Ramp-up. A Laravel-fluent team will need roughly 1–2 sprints of learning across Symfony UX/Stimulus/Twig plus the carrier domain before contributing confidently; a Symfony team far less. Either way, produce an internal runbook covering credential rotation per carrier, geocoder failover, the session store dependency, and the order-attachment verification query. Recommendation: proceed to a time-boxed spike, but do not commit to this package as a Laravel dependency until the standalone-usability questions are answered.
How can I help you explore Laravel packages today?