Search code examples
symfonydoctrine-ormdoctrinesymfony4entitymanager

Kayue\WordpressBundle with Symfony 4.4.1: The class XXX was not found in the chain configured namespaces App\Entity


I'm trying to work with kayue/KayueWordpressBundle installed with composer as composer require kayue/kayue-wordpress-bundle in my Symfony 4.4.1 project but I'm unable to.

This is what I'm trying to do:

<?php

namespace App\Service\WordPress;

use Doctrine\ORM\EntityManagerInterface;
use Kayue\WordpressBundle\Entity\Post;

class PostCollection
{
    protected $postRepository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->postRepository = $entityManager->getRepository(Post::class);
    }
}

The error I get:

The class 'Kayue\WordpressBundle\Entity\Post' was not found in the chain configured namespaces App\Entity

At first I blamed my dual-database configuration (Symfony is on a different DB from Wordpress) but then I put the DBs together and the issue persists:

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # Only needed for MySQL (ignored otherwise)
        charset: utf8mb4
        default_table_options:
            collate: utf8mb4_unicode_ci
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

I've been fiddling for the past 2hrs, but now I'm fresh out of ideas. I wonder if ANYONE actually got this to work with Symfony 4.

Thanks!

Edit: other tries:

Direct post injection:

use Kayue\WordpressBundle\Entity\Post;
public function index(Post $post){}

Result:

Cannot autowire argument $post of "App\Controller\IndexController::index()": it references class "Kayue\WordpressBundle\Entity\Post" but no such service exists.

As per documentation: outdated Symfony 2 way

$repo = $this->get('kayue_wordpress')->getManager()->getRepository('KayueWordpressBundle:Post');

Result:

Service "kayue_wordpress" not found: even though it exists in the app's container, the container inside "App\Controller\IndexController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session" and "twig" services. Try using dependency injection instead.

The "best way" to do this would actually be:

    public function index(EntityManagerInterface $entityManager)
    {
$entityManager->getRepository('KayueWordpressBundle:Post');
}

Result:

The class 'Kayue\WordpressBundle\Entity\Post' was not found in the chain configured namespaces App\Entity


Solution

  • Although you found a solution to this, there is a chain of issues I would like to explain.

    The error

    The class 'Kayue\WordpressBundle\Entity\Post' was not found in the chain configured namespaces App\Entity

    means that in the entity manager provided, whose config is defined at:

    orm:
        ...
        mappings:
            App:
            ...
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App
    

    the entity type Kayue\WordpressBundle\Entity\Post was not found.

    Usually this type of error is solved by:

    • include the path Kayue\WordpressBundle\Entity in the entity manager or
    • use another entity manager which includes this path

    In your case the default entity manager is autowired, based on the service alias of Doctrine\ORM\EntityManagerInterface as explained here. The alias is defined in the doctrine bundle `s config which points to the default doctrine entity manager.

    You want to use Kayue\WordpressBundle `s entity manager, not the default one.

    Solution

    To solve this you can

    1) Bind Arguments By type, as you find out, creating an alias of Kayue\WordpressBundle\Wordpress\ManagerRegistry to the service kayue_wordpress, as:

    services:
          # pass this service for any ManagerRegistry type-hint for any
          # service that's defined in this file
          Kayue\WordpressBundle\Wordpress\ManagerRegistry: '@kayue_wordpress'
    

    or

    2) use Binding Arguments by Name, in this case the "$wpManagerRegistry", as:

    services:
    # default configuration for services in *this* file
        _defaults:
            ...
            bind:
                $wpManagerRegistry: '@kayue_wordpress'
    

    and then

    public function index($wpManagerRegistry)
    {
    
        $postRepository = $wpManagerRegistry->getManager()->getRepository('KayueWordpressBundle:Post');
    

    so that any argument with name "$wpManagerRegistry" is autowired to this service.

    References

    The Symfony 3.3 DI Container Changes Explained (autowiring, _defaults, etc)