async-aws/async-aws-bundle
A small Symfony bundle for AsyncAws that handles client configuration and autowiring. It registers AsyncAws clients as Symfony services, loads credentials and endpoint settings from config or environment variables, and lets you inject any AWS client directly into your services.
async-aws/async-aws-bundle is a Symfony HttpKernel bundle. It ships a Configuration tree and a DependencyInjection\Extension that are only ever invoked by Symfony's Kernel::registerBundles() / ContainerBuilder lifecycle. Laravel has no equivalent contract, no bundle auto-discovery, and no config-tree compilation step. In a Laravel app the bundle is inert unless we manually instantiate Symfony's DI container inside a service provider — architecturally indefensible.async-aws/core and the per-service packages, which are framework-agnostic, PSR-18/PSR-17 based, and require no Symfony runtime. That is the real integration surface for us.async-aws/s3, async-aws/sqs, async-aws/dynamo-db, etc.) bound into Laravel's container by a first-party service provider we own (~100–200 LOC). We keep Laravel's config/env conventions and avoid a second DI container.async-aws returns promises and resolves them via Symfony HttpClient's curl multiplexing. Under PHP-FPM with a synchronous Laravel request lifecycle, the concurrency win is real but bounded — it mostly helps batch/concurrent AWS calls inside a job or command, not across requests. Under Octane the picture improves but long-lived container state and connection reuse need explicit verification.symfony/http-kernel, symfony/config, and symfony/dependency-injection as runtime dependencies purely to execute code Laravel never calls, and it introduces a package-lifetime coupling to an artifact whose only API is Symfony-internal.config/async_aws.php, constructs each client with region/credentials/endpoint, and binds S3ClientInterface, SqsClientInterface, etc. Laravel autowiring then resolves them in controllers, jobs, and listeners exactly as the Symfony bundle does for Symfony.credential_provider, credential_provider_cache, SSM parameter loading, secrets with max_results. We must re-implement that logic ourselves (~1–2 days for a solid version with a cache-backed provider), or copy the extension's approach as reference. This is the single largest piece of "free" work we give up by skipping the bundle.async-aws ships MockClient, which makes unit and feature tests clean without LocalStack. This is a genuine ergonomic advantage over aws-sdk-php's mocking story.async-aws itself.async-aws is a small-maintainer, community, MIT project with no vendor SLA. Bus factor and roadmap responsiveness are open questions relative to aws-sdk-php, which is AWS-owned and first-party.async-aws is not a drop-in for AWS SDK v3. We need to confirm per-service coverage for what we use: S3 multipart/transfer-manager behavior, SQS partial-batch failures and FIFO semantics, DynamoDB paginators, waiters, presigned URL expiry, and any X-Ray/observability hooks we rely on today.aws-sdk-php's synchronous exceptions. Without prior team exposure this becomes a recurring debugging tax.aws-sdk-php features are load-bearing for us — X-Ray, waiters, transfer manager, custom retry/backoff?async-aws/core + only the per-service packages we need. Do not adopt async-aws/async-aws-bundle.AsyncAwsServiceProvider + config/async_aws.php mirroring the bundle's config shape (clients, credential_provider, credential_provider_cache, secrets, ssm) so any future migration back to a Symfony service — or to the bundle if we ever run Symfony — is a config move, not a rewrite.S3ClientInterface / SqsClientInterface in our domain code so the provider is the only file that knows about async-aws.aws-sdk-php usage in place behind our own narrow port interfaces (e.g., ObjectStorage, QueuePublisher), then swap implementations service by service.GetObject or SSM parameter read) through async-aws under a Laravel provider. Measure cold-start and request overhead versus the current client.aws-sdk-php at whatever remains, or retire it entirely.aws-sdk-php without code changes. Insist on this before Phase 2.async-aws clients are plain constructors, so no adapter layer is needed.Psr\Http\Client\ClientInterface. Resolve this in Phase 0 — it determines whether we add a third HTTP stack.async_aws channel behavior).aws-sdk-php callsites.async-aws releases frequently (17 minor versions of the bundle, each adding services). Minor-version churn is real; lock to ^3.0 for core and pin per-service packages, review changelogs on a schedule rather than continuously.Extension/Configuration classes even as a reference at runtime — copy the approach, not the coupling.aws-sdk-php, where AWS provides first-party support and same-day API coverage.aws-sdk-php in hours, not days.async_aws Monolog channel; we must replicate that into Laravel's logging with the same channel name so existing runbooks/alerts port over.aws-sdk-php exceptions. Every callsite needs an explicit catch and a defined fallback; silent partial failures are the primary risk.aws-sdk-php, not async-aws. Expect 1–2 weeks of learning curve on promise handling, credential providers, and the MockClient testing pattern.aws-sdk-php vs async-aws call patterns for the three services we use most, so reviewers see the diff before Phase 2.Reject the bundle; evaluate the underlying clients on their own merits. The Symfony bundle offers a Laravel team nothing it can use, and wrapping Symfony's DI container inside Laravel is a maintenance liability with no payoff. The underlying async-aws packages are legitimate and do solve boilerplate and concurrency problems — but at 0 dependents and with a feature-parity gap against first-party tooling, this is a Phase 0 spike, not a roadmap commitment. Gate any further investment on a measured latency/throughput win in one non-critical service and an honest answer to whether we actually have the concurrency problem this solves.
How can I help you explore Laravel packages today?