DoctrineBundle i bridge odpowiadają za integracje Doctrine ORM z frameworkiem Symfony. Jedną z funkcjonalności jaką oferuje DoctrineBundle jest automatyczna rejestracja mapowań w bundlach. Dopóki stosujemy się do konwencji, tzn umieszczamy encje w katalogu Entity, czy też mapowania w Resources/config/doctrine, doctrine zauważy naszą konfigurację i ją automatycznie zarejestruje. Wszystko dzięki domyślnie włączonej (w standardowej dystrybucji Symfony) opcji auto mapping. Jest to bardzo wygodne, bo nie musimy dużo robić, aby zacząć pracę z ORMem.
Z drugiej strony czasem lepiej jest, gdy nasze encje nie są częścią bundla, ale leżą gdzieś w ogólnej przestrzeni nazw. Jest to często lepsze podejście, jeśli nasze encje używane są w wielu bundlach lub nawet projektach. Największą zaletą tej metody jest odseparowanie warstwy ORMa od Symfony. Wydzielając ją do katalogu poza bundlem tworzymy bibliotekę, która jest niezależna od Symfony i może być potencjalnie użyta w dowolnym projekcie PHP.
Najlepszym miejscem by skonfigurować mapowanie jest plik app/config/config.yml:
doctrine:
orm:
# ...
mappings:
Acme:
type: annotation
is_bundle: false
dir: %kernel.root_dir%/../src/Acme/Entity
prefix: Acme\Entity
alias: Acme
W powyższym przykładzie użyliśmy adnotacji, stąd opcja dir jest ścieżką do katalogu z encjami. W przypadku mapowania xml czy yml byłaby to ścieżka do katalogu z plikami xml/yml. Prefix jest fragmentem przestrzeni nazw naszych encji i powinien być unikalny. Dzięki aliasowi będziemy mogli odnosić się do encji przy pomocy krótszej notacji. Przykładowo zamiast:
$entityManager->getRepository('Acme\Entity\Invoice');
użylibyśmy:
$entityManager->getRepository('Acme:Invoice');
Oczywiście możemy zdefiniować tyle mapowań ile tylko potrzebujemy, co pozwala nam grupować encje w niezależne przestrzenie nazw oraz używać odmiennych metod mapowania:
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