Zend migracja do Doctrine

2012-02-07 , Papiewski Łukasz , Programowanie / Kodzenie

Jak możemy w Zend Framework dodać wsparcie dla Doctrine'a. Doctrine jest wg mnie najlepszą biblioteką do mapowania relacyjnego obiektów w PHP (ORM) i aż się prosi aby go używać zamiast niezbyt doskonałego Zend_Db.

Doctrine

W pierwszej kolejności sciągamy Doctrine'a do biblioteki.

#inside Zend project
cd library
svn co http://svn.doctrine-project.org/branches/1.2/lib/Doctrine
wget http://svn.doctrine-project.org/branches/1.2/lib/Doctrine.php

Następnie należy dodać i skonfigurować Doctrine'a. Można to zrobić dwojako: samemu konfigurując lub używjąc pluginu. Oczywiście jak jest już coś zrobione nie będziemu wymyślać koła dwa razy (choć nie jest to takie trudne)

Aby ręcznie zarejestrować przestrzeń nazw Doctrine trzeba uruchomić jego autoloadera w aplikacji. Przykładowo w Bootstrap.php umieszczało się:

(...) 
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true); 
Doctrine_Core::loadModels($doctrineConfig['models_path']);
$conn = Doctrine_Manager::connection($doctrineConfig['dsn'], 'doctrine');
(...)

Wraz z nowszymi wersjami Zend pojawiało się trochę konfliktów i utrudnień związanych z agresywnyn wczytywaniem modeli czy generacją SQL (tak przypuszczam). Dlatego pominę manualną kwestię wstawiania Doctrine (w razie potrzeby odwołuje do projektu ZFPlanet na GitHub) i przejdą od razu do bibliotki ZFDoctrine.

ZFDoctrine

Pobieramy do katalogu 'library' bibliotę

http://svn.github.com/beberlei/zf-doctrine.git/library/ZFDoctrine

W pliku ~/.zf.ini należy dodać

basicloader.classes.0 = "ZFDoctrine_Tool_DoctrineProvider"

Dzięki temu po wywołaniu zf w projekcie pojawiają się nowe funkcje

Zf wykorzystuje plik zf.ini do pobierania ścieżek do bibliotek. Wśród nich musi buć ZFDoctrine, Doctrine i Zend, inaczej nie wygenerujemy projektu.

$zf ? Doctrine
Doctrine
    zf create-project doctrine dsn zend-project-style library-per-module single-library
    zf build-project doctrine force load reload
    zf create-database doctrine
    zf drop-database doctrine force
    zf create-tables doctrine
    zf generate-sql doctrine
    zf dql doctrine
    zf load-data doctrine append
    zf dump-data doctrine individual-files
    zf generate-models-from-yaml doctrine
    zf generate-yaml-from-models doctrine
    zf generate-yaml-from-database doctrine
    zf generate-migration doctrine class-name d-from-database m-from-models
    zf execute-migration doctrine to-version
    zf show-migration doctrine
    zf show doctrine

W tym momencie można wygenerować nowy projekt na którym można zacząć wszystko testować. Następnie parę wpisów w application.ini i można przystąpić do przerzucania obecnej bazy. Do application.ini należy dodać (zmienić):

resources.doctrine.connections.default.dsn = "mysql://USER@localhost/DBNAME"
 ;tu może być model_loading_zend, model_loading_zend_module_library, model_loading_zend_single_library
 resources.doctrine.manager.attributes.attr_model_loading = "model_loading_zend_sinle_library"
 pluginpaths.ZFDoctrine_Application_Resource = "ZFDoctrine/Application/Resource"
 autoloaderNamespaces[] = "Doctrine"
 autoloaderNamespaces[] = "ZFDoctrine"
 resources.frontController.params.prefixDefaultModule = "0"
 resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
 resources.doctrine.manager.attributes.attr_model_loading = "model_loading_zend"

Po dodaniu w application/config/schema odpowiednich schematów bazy dany, należy je wygenerować. Następnym krokiem jest wygenerowanie table bazy danych (create-database create-tables). Ważne w tym miejscu jest aby aplikacji widziała wygenerowane modele - odpowiednie wpis w Bootstrap. W przypadku modeli, w polecanej przeze mnie metodzie 'single-library' w application.ini, wykonuje to komenda. ZFDoctrine_Core::setSingleLibraryPath(APPLICATION_PATH.'/../library'); Jeśli modele są widoczne (zf show doctrine je pokazuje) można je wygenerować (jeśli nie to trzeba to poprawić).

Cytaty

- Simplicity is the ultimate sophistication. - Leonardo da Vinci,
- Popularny człowiek wzbudza zawiść potężnych - Thufir Hawat o Leto Atrydzie (na Kaladanie),
- Szczęście następuje po smutku, a smutek po szczęściu; człowiek jest naprawdę wolny, gdy przestaje rozróżniać między smutkiem a szczęściem, między dobrem a złem - Aforyzmy buddyjskie.