convenia/pigeon
Convenia Pigeon is a Laravel/PHP package for adding message-based communication to your application. It offers a simple, configurable API for publishing and consuming messages, helping teams build decoupled services and reliable workflows with minimal boilerplate.
Architecture fit
dispatch(), queue(), exchange(), routing(), events()). v3.2.0 adds a single opt-in config gate, pigeon.skip_auto_declaration, exposed as PIGEON_SKIP_AUTO_DECLARATION, defaulting to false.Integration feasibility
false preserves today's declare-on-first-use behavior, so composer update alone is behaviorally inert.Technical risk
vendor:publish hold a stale config/pigeon.php that lacks the key. If Driver reads config('pigeon.skip_auto_declaration') without a default and then enforces the boolean validation described in the notes, a null could raise the "clear exception" on every existing install after upgrade. If instead it uses config(..., false), this is a non-issue. The release notes do not specify which. This is the single item that could turn a backward-compatible minor into a fleet-wide outage, and it deserves a reproduction test in a scratch app before we approve the bump.env() returns strings; PIGEON_SKIP_AUTO_DECLARATION=false under a naive (bool) cast becomes true. If the package handles this internally, fine; if the config file is expected to cast it, our published config must be updated alongside. Same class of bug that historically bites QUEUE_CONNECTION-style flags.dispatch, queue, exchange, routing, events), but the guard is described as applied in only three (queue, exchange, routing). This is plausibly correct if dispatch() and events() funnel through routing()/exchange(), but it is unverified. If any path bypasses the guard, the flag becomes a partial switch and our "no broker writes from the app" guarantee is false — which breaks the compliance story we would use to justify adopting it.tests/Unit/DriverTest.php) against a mocked or stubbed driver. No integration test asserts the real broker error surface when topology is absent. Acceptable for a config gate, but it means the documented failure mode ("broker error instead of silent creation") is asserted by documentation, not by CI.Key questions
Driver read the config with a false default, and does an absent key (stale published config) behave as false rather than throwing?filter_var / (bool) on the cast value), and does PIGEON_SKIP_AUTO_DECLARATION=false reliably evaluate false?dispatch() and events() reliably route through the guarded queue()/exchange()/routing() methods, or do they issue declarations independently?NOT_FOUND for missing queue/exchange, 406 PRECONDITION_FAILED for parameter mismatch), and are they distinguishable in logs?docs/_coverpage.md?Stack fit
Migration path
^3.2, republish/merge config/pigeon.php to pick up the new key (verify the merge is additive and does not clobber overrides), then leave the flag false everywhere. Enable per environment only after the topology-parity check below passes.Compatibility
php artisan config:cache: the flag is read once at cache time, so flipping the env var requires a cache rebuild. Our runbooks and deployment docs must state this explicitly, or operators will toggle the env var and observe no change.composer.json constraints are still satisfied by our current matrix before scheduling.Sequencing
false and true to confirm correct coercion.dispatch() and events() via a broker packet capture or debug-level log inspection in a non-production environment.false, rebuild config cache, redeploy. Rollback is instantaneous and safe.Maintenance
docs/_coverpage.md is a good signal of general hygiene.Support
NOT_FOUND / 406 PRECONDITION_FAILED on publish to "check topology deployment," and ensure the IaC pipeline is the documented first responder for that alert.Scaling
Failure modes
dispatch()/events() bypass the guard, the app still writes to the broker in a mode we've told compliance is read-only. Low probability, high credibility cost.Ramp-up
docs/ADVANCED.md.How can I help you explore Laravel packages today?