symfonydoctrinemappingfosuserbundlemappingexception

Symfony 2.5.5 & FOSUserBundle: the class ... was not found in the chain configured namespaces


Recently, I started working with Symfony2. Now I want to add a user management engine to my site.

But I'm facing a problem. This is what I'm doing:

  1. In terms of creating/installing a basic Symfony2 project:

    $ composer create-project symfony/framework-standard-edition path/ "2.5.*"
    $ mv path/* ./
    $ rm -r path/
    
  2. Ok, so much for Symfony 2.5.5. Next, download the FOSUserBundle and create a custom bundle:

    $ composer require friendsofsymfony/user-bundle '~2.0@dev'
    $ php app/console generate:bundle --namespace=Meiblorn/CoreBundle --format=yml
    
  3. Create the User class in the Meiblorn\CoreBundle\Framework\Domain namespace

    /**
     * User: Meiblorn
     * Date: 15/10/14
     * Time: 20:17
     */
    
    namespace Meiblorn\CoreBundle\Framework\Domain;
    
    use FOS\UserBundle\Model\User as FOSUserBundleUser;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(
     *      name = "users"
     * )
     */
    class User extends FOSUserBundleUser {
    
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        public function __construct() {
            parent::__construct();
            // your own logic
        }
    
    }
    
    ?>
    
  4. Configure the security.yml and config.yml. Finally, I got this:

    AppKernel.php

    $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
    
            new FOS\UserBundle\FOSUserBundle(),
    
            new Meiblorn\CoreBundle\MeiblornCoreBundle(),
    );
    

    config.yml

    imports:
        - { resource: parameters.yml }
        - { resource: security.yml }
    
    framework:
        #esi:             ~
        translator:      { fallback: "%locale%" }
        secret:          "%secret%"
        router:
            resource: "%kernel.root_dir%/config/routing.yml"
            strict_requirements: ~
        form:            ~
        csrf_protection: ~
        validation:      { enable_annotations: true }
        templating:
            engines: ['twig']
            #assets_version: SomeVersionScheme
        default_locale:  "%locale%"
        trusted_hosts:   ~
        trusted_proxies: ~
        session:
            # handler_id set to null will use default session handler from php.ini
            handler_id:  ~
        fragments:       ~
        http_method_override: true
    
    # Twig Configuration
    twig:
        debug:            "%kernel.debug%"
        strict_variables: "%kernel.debug%"
    
    # Assetic Configuration
    assetic:
        debug:          "%kernel.debug%"
        use_controller: false
        bundles:        [ ]
        #java: /usr/bin/java
        filters:
            cssrewrite: ~
            #closure:
            #    jar: "%kernel.root_dir%/Resources/java/compiler.jar"
            #yui_css:
            #    jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar"
    
    # Doctrine Configuration
    doctrine:
        dbal:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8
        orm:
            auto_generate_proxy_classes: "%kernel.debug%"
            auto_mapping: true
    
    # Swiftmailer Configuration
    swiftmailer:
        transport: "%mailer_transport%"
        host:      "%mailer_host%"
        username:  "%mailer_user%"
        password:  "%mailer_password%"
        spool:     { type: memory }
    
    fos_user:
        db_driver: orm
        firewall_name: prod
        user_class: Meiblorn\CoreBundle\Framework\Domain\User
    

    security.yml

    security:
            encoders:
                FOS\UserBundle\Model\UserInterface: sha512
    
            role_hierarchy:
                ROLE_ADMIN:       ROLE_USER
                ROLE_SUPER_ADMIN: ROLE_ADMIN
    
            providers:
                fos_userbundle:
                    id: fos_user.user_provider.username
    
            firewalls:
                prod:
                    pattern: ^/
                    form_login:
                        provider: fos_userbundle
                        csrf_provider: form.csrf_provider
                    logout:       true
                    anonymous:    true
                dev:
                    pattern: ^/(_(profiler|wdt)|css|images|js)/
                    security: false
    
            access_control:
                - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
                - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
                - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
                - { path: ^/admin/, role: ROLE_ADMIN }
    

THIS IS THE PROBLEM

In browser:  http://localhost/test.meiblorn.com/web/app_dev.php/

MappingException: The class 'Meiblorn\CoreBundle\Framework\Domain\User' was not found in the chain configured namespaces FOS\UserBundle\Model
in /Library/WebServer/Documents/test.meiblorn.com/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php line 37
at MappingException::classNotFoundInNamespaces('Meiblorn\CoreBundle\Framework\Domain\User', array('FOS\UserBundle\Model')) in /Library/WebServer/Documents/test.meiblorn.com/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php line 113
at MappingDriverChain->loadMetadataForClass('Meiblorn\CoreBundle\Framework\Domain\User', object(ClassMetadata)) in /Library/WebServer/Documents/test.meiblorn.com/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php line 117
at ClassMetadataFactory->doLoadMetadata(object(ClassMetadata), object(ClassMetadata), false, array()) in /Library/WebServer/Documents/test.meiblorn.com/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php line 318

Also Doctrine doesn't create tables for this mapping when calling doctrine:schema:update

Please, help me to fix this exception


UPDATE! How to fix

Final configuration for my namespace

orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        auto_mapping: false
        mappings:
            FOSUserBundle: ~
            MeiblornCoreBundle:
                type: annotation
                dir: %kernel.root_dir%/../src/Meiblorn/CoreBundle/Framework/Entity
                prefix: Meiblorn\CoreBundle\Framework\Entity
              # alias: MyModels
              # is_bundle: true

Solution

  • First you need to configure psr-4 autoload in your composer.js, for example

    "autoload": {
        "psr-4": {
          "Meiblorn\\CoreBundle\\": "src/Meiblorn/CoreBundle/"
        }
    },
    

    Then call composer dumpautoload.

    Secondly, I believe Doctrine expects the entities to live in a folder Entity/, so try to move you model: src/Meiblorn/CoreBundle/Framework/Domain/User.php to src/Meiblorn/CoreBundle/Entity/User.php or How do I change symfony 2 doctrine mapper to use my custom directory instead of my Entity Directory under the bundle