Autowiring resolves by type, and a string has no type to resolve — so every service with a configuration value needs an explicit argument, which is the thing autowiring was meant to remove.
services:
_defaults:
autowire: true
bind:
string $projectDir: '%kernel.project_dir%'
string $stripeKey: '%env(STRIPE_KEY)%'
iterable $exporters: !tagged_iterator app.exporter
Binding by parameter name and type together is the 5.x form and is stricter than the old name-only version, which is worth adopting because it catches a name collision between two differently typed arguments. The failure mode is real and quiet: renaming a constructor parameter silently unbinds it, and the error appears at container compile rather than at the rename. lint:container in CI is what turns that into a build failure.