The DoctrineBundle and Doctrine bridge are the integration layer between the Doctrine ORM and Symfony. One of features they provide is an automatic registration of entity mappings.
As long as we follow conventions, like putting entities into the Entity folder or mappings into the Resources/config/doctrine folder, mappings will be configured for us. In the Symfony Standard Edition this behaviour is enabled by default, thanks to the auto mapping configuration option.
It's convenient, since we don't have to do much to start working with the ORM.
However, in some situations I found it better to put the entities in a more general namespace to separate them from the bundle. This way it's possible to share the entities between multiple bundles or projects in a clean way.
Best place to define the mapping configuration is the app/config/config.yml file:
doctrine:
orm:
# ...
mappings:
Acme:
type: annotation
is_bundle: false
dir: %kernel.root_dir%/../src/Acme/Entity
prefix: Acme\Entity
alias: Acme
Our example uses the annotation driver and therefore the dir option is a path to our entities. If we used xml or yml drivers this would need to be changed to the path where mapping files are stored.
Prefix is a part of the namespace our entities belong to and should be unique between all the mappings.
With alias we can refer to the entities with a shorter syntax, so instead of:
$entityManager->getRepository('Acme\Entity\Invoice');
we'll be able to use:
$entityManager->getRepository('Acme:Invoice');
Finally, we can define as many mappings as we need, so it's still possible to group entities in separate namespaces:
doctrine:
orm:
# ...
mappings:
AcmeCustomer:
type: annotation
is_bundle: false
dir: %kernel.root_dir%/../src/Acme/Customer/Entity
prefix: Acme\Customer\Entity
alias: Customer
AcmeCms:
type: yml
is_bundle: false
dir: %kernel.root_dir%/../src/Acme/Cms/Entity/config
prefix: Acme\Cms\Entity
alias: CMS