Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages in full color showing how to combine Symfony with Docker, APIs, queues & async tasks, Webpack, Single-Page Applications, etc.

Buy printed version
WARNING: You are browsing the documentation for Symfony 4.1 which is not maintained anymore. Consider upgrading your projects to Symfony 5.1.

How to Inject Instances into the Container

How to Inject Instances into the Container

In some applications, you may need to inject a class instance as service, instead of configuring the container to create a new instance.

For instance, the kernel service in Symfony is injected into the container from within the Kernel class:

// ...
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpKernel\TerminableInterface;

abstract class Kernel implements KernelInterface, TerminableInterface
{
    // ...

    protected function initializeContainer()
    {
        // ...
        $this->container->set('kernel', $this);

        // ...
    }
}

Services that are set at runtime are called synthetic services. This service has to be configured so the container knows the service exists during compilation (otherwise, services depending on kernel will get a “service does not exist” error).

In order to do so, mark the service as synthetic in your service definition configuration:

  • YAML
    1
    2
    3
    4
    5
    # config/services.yaml
    services:
        # synthetic services don't specify a class
        app.synthetic_service:
            synthetic: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
    
            <!-- synthetic services don't specify a class -->
            <service id="app.synthetic_service" synthetic="true" />
    
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    // config/services.php
    // synthetic services don't specify a class
    $container->register('app.synthetic_service')
        ->setSynthetic(true)
    ;
    

Now, you can inject the instance in the container using Container::set():

// instantiate the synthetic service
$theService = ...;
$container->set('app.synthetic_service', $theService);

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.