Published on

Import / Structure Symfony Service Definition YAML Files (e.g. in TYPO3)

Authors

When projects grow, a single services.yaml becomes unwieldy. Symfony’s DI supports imports so you can split configuration by domain (commands, listeners, repositories, …). This also works nicely in TYPO3 extensions.

Main services.yaml with imports

# Configuration/Services.yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  # Import additional service definitions
imports:
  - { resource: services/commands.yaml }
  - { resource: services/listeners.yaml }
  - { resource: services/repositories.yaml }

Example: commands.yaml

# Configuration/services/commands.yaml
services:
  App\Command\CleanupCommand:
    tags: ['console.command']

Example: listeners.yaml

# Configuration/services/listeners.yaml
services:
  App\EventListener\MyListener:
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Example: repositories.yaml

# Configuration/services/repositories.yaml
services:
  App\Repository\CustomerRepository:
    arguments:
      $connection: '@doctrine.dbal.default_connection'

Tips

  • Keep naming and folder structure consistent (one file per concern)
  • Use _defaults in the main file to reduce boilerplate
  • In TYPO3, place files inside your extension (e.g. EXT:my_ext/Configuration/...) and adjust paths accordingly

Conclusion

Using imports makes DI config easier to navigate and reduces merge conflicts in large teams.