title: How to configure Doctrine Entity Annotation autoloading in User-defined symfony Bundle?
body: <p>When I try to validate my symfony schema, I get the error:</p>
  
  <pre><code>[Doctrine\Common\Annotations\AnnotationException]                            
  [Semantical Error] The annotation "@Doctrine\Orm\Mapping\Entity" in class C  
  hill\EmailUser\Entity\EmailUser does not exist, or could not be auto-loaded 
  </code></pre>
  
  <p>I see that in this question: <a href="https://stackoverflow.com/questions/11910147/trouble-with-importing-annotations">Trouble with importing annotations</a>, it is said we need to change from Doctrine Simple Annotation Reader. Even though it seems strange to make bundle config in the autoloader, I tried doing that via app/autoloader.php:</p>
  
  <pre><code>use Doctrine\ORM\Configuration;
  
  path = __DIR__."/../vendor/path/to/annotationDriver.php"
  Configuration::newDefaultAnnotationDriver(path, false);
  </code></pre>
  
  <p>I also tried researching to see if I could find a parameter like: </p>
  
  <pre><code>doctrine.orm.mappings.annotations.simple_annotations_reader
  </code></pre>
  
  <p>that I could set to false, but I couldn't find anything.</p>
  
  <p>As you'll see below, I also tried manualling adding mapping for my bundle to the ORM setting in config.yml.</p>
  
  <p>composer.json:</p>
  
  <pre><code>{
      "name": "root/photoproject",
  "license": "proprietary",
  "type": "project",
  "autoload": {
      "psr-4": {
          "": "src/"
      },
      "classmap": [
          "app/AppKernel.php",
          "app/AppCache.php"
      ]
  },
  "autoload-dev": {
      "files": [
          "vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php"
      ]
  },
  "require": {
      "php": "&gt;=5.3.9",
      "doctrine/annotations": "^1.4",
      "doctrine/doctrine-bundle": "~1.4",
      "doctrine/migrations": "^1.5",
      "doctrine/orm": "^2.5",
      "incenteev/composer-parameter-handler": "~2.0",
      "sensio/distribution-bundle": "~4.0",
      "sensio/framework-extra-bundle": "^3.0.2",
      "symfony/monolog-bundle": "^3.0.2",
      "symfony/swiftmailer-bundle": "~2.3,&gt;=2.3.10",
      "symfony/symfony": "2.8.*",
      "twig/twig": "^1.0||^2.0"
  },
  "require-dev": {
      "sensio/generator-bundle": "~3.0",
      "symfony/phpunit-bridge": "~2.7"
  },
  "scripts": {
      "symfony-scripts": [
          "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
          "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
          "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
          "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
          "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
          "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
      ],
      "post-install-cmd": [
          "@symfony-scripts"
      ],
      "post-update-cmd": [
          "@symfony-scripts"
      ]
  },
  "config": {
      "bin-dir": "bin",
      "sort-packages": true
  },
  "extra": {
      "symfony-app-dir": "app",
      "symfony-web-dir": "web",
      "symfony-assets-install": "relative",
      "incenteev-parameters": {
          "file": "app/config/parameters.yml"
      },
      "branch-alias": null
  }
  }
  </code></pre>
  
  <p>app/config/config.yml</p>
  
  <pre><code>imports:
  - { resource: parameters.yml }
  - { resource: security.yml }
  - { resource: services.yml }
  
  # Put parameters here that don't need to change on each machine where the app is deployed
  # http://symfony.com/doc/current/best_practices    /configuration.html#application-related-configuration
  parameters:
  locale: en
  
      framework:
  #esi: ~
  #translator: { fallbacks: ['%locale%'] }
  secret: '%secret%'
  router:
      resource: '%kernel.root_dir%/config/routing.yml'
      strict_requirements: ~
  form: ~
  csrf_protection: ~
  validation: { enable_annotations: true }
  serializer: { enable_annotations: true }
  templating:
      engines: ['twig']
  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%'
      # Doctrine Configuration
      doctrine:
  dbal:
      driver: pdo_mysql
      host: '%database_host%'
      port: '%database_port%'
      dbname: '%database_name%'
      user: '%database_user%'
      password: '%database_password%'
      charset: UTF8
      # if using pdo_sqlite as your database driver:
      #   1. add the path in parameters.yml
      #     e.g. database_path: '%kernel.root_dir%/data/data.db3'
      #   2. Uncomment database_path in parameters.yml.dist
      #   3. Uncomment next line:
      #path: '%database_path%'
  
  orm:
      auto_generate_proxy_classes: '%kernel.debug%'
      entity_managers:
          default:
              naming_strategy: doctrine.orm.naming_strategy.underscore
              auto_mapping: true
              mappings:
                  ChillEmailUserBundle: ~
  
      # Swiftmailer Configuration
      swiftmailer:
  transport: '%mailer_transport%'
  hostity/l: { type: memory }
  </code></pre>
  
  <p>src/Chill/EmailUserBundle/Entity/EmailUser.php</p>
  
  <pre><code>namespace Chill\EmailUser\Entity;
  
  use Doctrine\Orm\Mapping as ORM;
  use Symfony\Component\Validator\Contraints as Assert;
  
  /**
   * @ORM\Entity
   */
  
  class EmailUser
  {
      /**
       * @ORM\Column(type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      private $id;
  
      /**
       * @ORM\Column(type="string", length="1023")
       * @Assert\Email(message="Not a valid email")
       */
      private $email;
  
      /**
       * @ORM\Column(type="string", length="4096")
       */
      private $password;
  
      /**
       * @ORM\Column(type="string", length="4096")
       */
      private $salt;
  
      /**
       * @ORM\ManyToMany(targetEntity="Role")
       */
      private $roles;
  }
  </code></pre>
  
  <p>So my question is how can I do what the accepted answer was suggesting in Symfony (while preferably keeping the bundle relatively re-usable).</p>
  
  <p>Thanks </p>
  
  <hr>
  
  <pre><code>&lt;?php
  
  use Doctrine\Common\Annotations\AnnotationRegistry;
  use Composer\Autoload\ClassLoader;
  
  /** @var ClassLoader $loader */
  $loader = require __DIR__.'/../vendor/autoload.php';
  AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
  return $loader;                            
  </code></pre>