How to inject a service in another service in Symfony?

For Symfony 3.3, 4.x, 5.x and above, the easiest solution is to use Dependency Injection

You can directly inject the service into another service, (say MainService)

// AppBundle/Services/MainService.php
// 'serviceName' is the service we want to inject
public function __construct(\AppBundle\Services\serviceName $injectedService)  {
    $this->injectedService = $injectedService;
}

Then simply, use the injected service in any method of the MainService as

// AppBundle/Services/MainService.php
public function mainServiceMethod() {
    $this->injectedService->doSomething();
}

And viola! You can access any function of the Injected Service!

For older versions of Symfony where autowiring does not exist -

// services.yml
services:
    \AppBundle\Services\MainService:
        arguments: ['@injectedService']

You pass service id as argument to constructor or setter of a service.

Assuming your other service is the userbundle_service:

userbundle_service:
    class:        Main\UserBundle\Controller\UserBundleService
    arguments: [@security.context, @logger]

Now Logger is passed to UserBundleService constructor provided you properly update it, e.G.

protected $securityContext;
protected $logger;

public function __construct(SecurityContextInterface $securityContext, Logger $logger)
{
    $this->securityContext = $securityContext;
    $this->logger = $logger;
}

Tags:

Php

Symfony