hasel/aphpsurd-bundle
Symfony bundle for simple URL redirects. Define source-to-target rules, match incoming request paths, and send visitors to updated destinations. Helps preserve SEO when URLs change, with Doctrine-backed storage and straightforward configuration.
Architecture fit. The package provides typed task spawning — dispatching a job by handing an instance of a payload type to a spawner — which fits Laravel's job/queue idiom but is more opinionated than dispatch(new Job(...)). The 0.2.0 release strengthens the type contract: one payload type maps to exactly one task. That is a clean, stateless design and a good fit for teams already modelling commands as value objects. It is a poor fit for codebases that reuse a single DTO (e.g. OrderPayload, SyncPayload) across several handlers.
Integration feasibility. Low API surface — spawn a task with a payload instance — so a spike is cheap. The cost is not the API but the inventory and refactor: every payload type shared across tasks must be split or wrapped before 0.2.0 can boot. Feasibility is therefore medium: mechanically simple, but touchy in a mature codebase where payload classes have been reused as generic DTOs.
Technical risk.
LogicException is described as thrown "at container compile time." In a Laravel context this phrase is ambiguous — Laravel's container does not have a compile phase, so this is either a custom compiled dispatcher registry, a cached-bindings artefact, or the package is a Symfony-style bundle wrapped for Laravel. If the exception surfaces during config:cache/route:cache or application boot, a single duplicate payload binding takes down every request and every queued worker, not just the offending task. That is a deploy-time, whole-application failure mode and the single largest risk in this release.hasel-at is a small publisher with no prior assessment baseline; no evidence yet of a support policy, deprecation window, or version matrix.Key questions for the maintainer / spike.
LogicException thrown — boot, cache warm, first dispatch, or artisan only? Can it be detected by a CI command rather than at runtime?__serialize, or the container? This determines what is safe to put in a payload.Stack fit. Suitable for a Laravel service that already treats jobs as typed commands and is comfortable with a stricter contract than Laravel's default dispatcher. Unsuitable where payload DTOs are shared infrastructure across modules. Recommend adopting behind a thin internal TaskSpawner facade so the package remains swappable and the 1-task-per-payload rule is enforced in one place rather than scattered across feature code.
Migration path.
LogicException is caught pre-merge rather than at deploy.Compatibility. Verify PHP and Laravel constraints, queue driver behaviour (database/Redis/SQS serialisation of payload instances), and interaction with config:cache and optimize in the deploy pipeline. Confirm Horizon/worker restart semantics if payload classes move namespace during the split.
Sequencing. Spike (1–2 days) → maintainer Q&A on the exception timing → payload inventory → refactor on 0.1.0 → CI boot gate → 0.2.0 upgrade in staging → production. Do not sequence the upgrade ahead of the inventory.
Maintenance. Pre-1.0 with a demonstrated willingness to break in minor versions. Treat each release as potentially breaking and budget recurring upgrade effort; keep the internal facade to contain churn. Track the changelog as a standing item in dependency review.
Support. Single small publisher, no established support SLA. Mitigation: vendor-risk note, internal ownership assigned to a named engineer, and the facade ensuring a 1–2 day exit path to native Laravel dispatching if the package stalls.
Scaling. Spawning by payload instance is cheap; no runtime overhead concern. The scaling risk is organisational: as the task count grows, the one-payload-per-task rule pushes toward a large number of narrow payload classes. That is healthy for clarity but increases file count and demands naming conventions. Document the convention early or the codebase will drift and re-trip the constraint.
Failure modes.
Ramp-up. API is small — an engineer is productive in under a day. The real ramp-up is the rule: engineers must internalise "one payload type, one task" and know that violating it fails at boot. Put this in the onboarding doc and encode it in the CI gate so it is learned by tooling rather than by incident. Estimate ~1 sprint for one engineer to complete inventory, refactor, and land the upgrade safely; add review time for the payload split if collisions exceed a handful.
How can I help you explore Laravel packages today?