Autowiring by argument name is a footgun with a nice name

When two services share an interface, Symfony resolves the ambiguity using the parameter name, which makes a rename a behaviour change.

services:
  AppClientPrimaryGateway: ~
  AppClientFallbackGateway: ~

  # binds by NAME: $primaryGateway, $fallbackGateway
  AppClientGatewayInterface $primaryGateway:
    '@AppClientPrimaryGateway'

// so renaming the constructor parameter changes which
// implementation is injected, silently.

A parameter name becoming part of the wiring is the same class of surprise as named arguments becoming part of a public API, and it arrives without any of the discussion. Explicit service configuration for the ambiguous cases is more verbose and cannot be broken by a rename, which on anything security-adjacent is the right trade.