Encje Doctrine poza bundlami Symfony

DoctrineBundlebridge 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

Komentarze