php - Cannot autowire service: Argument references class but no such service exists


I'm upgrading a project from Symfony 3 to Symfony 4 ( and I have many repository/services like this:

namespace App\Entity;

use App\Entity\Activation;
use Doctrine\ORM\EntityRepository;
use Predis\Client;

class ActivationRepository extends EntityRepository
    // ...

And when I try to run the project in the browser like this:


I get this error:

(1/1) RuntimeException
Cannot autowire service "App\Entity\ActivationRepository": 
argument "$class" of method 
references class "Doctrine\ORM\Mapping\ClassMetadata" 
but no such service exists.

Does this mean you have to create a service for "Doctrine\ORM\Mapping\ClassMetadata" in your services.yaml file?

Thanks to autowiring my new services.yaml file is fairly small compared to the old one, which had 2000+ lines. The new services.yaml just has several of these (so far):

    resource: '../src/*'

# Controllers
    resource: '../src/Controller'
    autowire: true
    public: true
    tags: ['controller.service_arguments']

# Models
    resource: '../src/Model/'
    autowire: true
    public: true

// etc

Question: Do you really need to add service definitions to services.yaml for third party vendor classes? And if so, can I get an example of how to do that please? Any advice from anyone who has already upgraded from Symfony 3 to Symfony 4 would be great.

PHP (cli) (built: Dec 7 2017 20:14:31) ( NTS ) Linux Mint 18, Apache2 Ubuntu.


This is the "Doctrine\ORM\EntityRepository::__construct()" which the ActivationRepository extends:

     * Initializes a new <tt>EntityRepository</tt>.
     * @param EntityManager         $em    The EntityManager to use.
     * @param Mapping\ClassMetadata $class The class descriptor.
    public function __construct(EntityManagerInterface $em, Mapping\ClassMetadata $class)
        $this->_entityName = $class->name;
        $this->_em         = $em;
        $this->_class      = $class;

which is located here:




Starting from the 1.8 version of DoctrineBundle, you can extend your class usingDoctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository instead ofDoctrine\ORM\EntityRepository. The result will be the same, but this does support the autowire.


use App\Entity\Activation;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;

class ActivationRepository extends ServiceEntityRepository
    public function __construct(ManagerRegistry $registry)
        parent::__construct($registry, Activation::class);

    // ...



Do you really need to add service definitions to services.yaml for third party vendor classes?

No, don't do that. My personal suggestion is: don't extendEntityRepository. Ever. You don't want your repository's interface to have method likecreateQuery orflush. At least, you don't want that if you consider a repository just like a collection of objects. If you extendEntityRepository you will have a leaky abstraction.

Instead you can inject theEntityManager inside your repository, and that's it:

use App\Entity\Activation;
use App\Repository\ActivationRepository;
use Doctrine\ORM\EntityManagerInterface;

final class DoctrineActivationRepository implements ActivationRepository
    private $entityManager;
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
        $this->entityManager = $entityManager;
        $this->repository = $this->entityManager->getRepository(Activation::class);

    public function store(Activation $activation): void

    public function get($id): ?Activation
        return $this->repository->find($id);

    // other methods, that you defined in your repository's interface.

No other steps are required.




My issue was a wrong namespace. File real position wasApp\Infrastructure\MySQL\Rubric\Specification But namespace was set toApp\Infrastructure\Rubric\Specification

Result "[blah blah] but no such service exists".

People are also looking for solutions to the problem: php - include a page selected in URL with $_GET


Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.