ticketpark/pingen-bundle
Symfony bundle that integrates the Pingen API for sending physical letters and postcards directly from your application. Configure your credentials, then generate, upload, and dispatch mail through simple services, ideal for automating transactional or bulk postal correspondence.
Architecture fit — poor, and categorically mismatched.
DependencyInjection, HttpKernel, and Config components and are registered through AppKernel; Laravel has no loader for Bundle classes. There is no supported path to composer require this into a Laravel application and have it "just work."ticketpark/pingen (a plain-PHP API client), not the bundle. Even that layer is a thin, 2015-era wrapper over a Pingen API generation that has since been superseded (token-based auth, revised letter/resource endpoints).Integration feasibility — low.
~5.4|~7.0-era with Guzzle 3.x/5.x. Modern Laravel requires PHP 8.2+ and ships Guzzle 7 plus Symfony 6/7 components. Composer will either hard-fail on constraints or require --ignore-platform-reqs / aliasing, which is unacceptable for production.Http client. Roughly 1–2 days of engineering for a scoped feature set.Technical risk — high, concentrated in three areas.
Key questions for the vendor/business owner.
Recommendation: do not adopt. Treat the repository as documentation only — read it for endpoint and payload shape, then build a first-party adapter against the current API behind an interface.
Stack fit.
MailDispatch contract in the domain layer with PingenMailDispatch and a LogMailDispatch/FakeMailDispatch stub as implementations. This keeps physical-mail side effects testable and swappable if Pingen is displaced by Swiss Post, Lob, or PostGrid.Http::withToken(...)->baseUrl(config('services.pingen.base')), no Pingen types leaking into controllers or jobs.Migration path.
DispatchLetterJob on a queue with $tries = 1 or explicit idempotency, exponential backoff on transport-only failures, and a persisted external_id written before submission.Compatibility.
~2.3 cannot coexist.composer.json. Keep the app's dependency graph clean.Sequencing.
Maintenance.
Support.
Scaling.
Failure modes.
pending → submitted → confirmed), never a naive retry.Ramp-up.
Http, Queue, Config), a typed contract, and a fake implementation that lets any developer run the suite without vendor credentials.How can I help you explore Laravel packages today?