Category: Doctrine


Doctrine 2 ins Zend Framework integrieren

Oktober 3rd, 2010 — 7:25pm

Ich verwende Doctrine in der Version 2.0.0RC1-DEV und das ZF 1.10. Die Doctrine Dateien kommen ins /library/ Verzeichnis (wo auch die Dateien des Zend Frameworks abgelegt sind), so dass dieses wie folgt aussieht:

library/
library/Zend/
library/Zend/Acl
...
library/Doctrine/
library/Doctrine/Common
library/Doctrine/DBAL
library/Doctrine/ORM
library/Doctrine/Symfony

Folgendes hat bei mir funktioniert, um Doctrine mit dem Zend Framework zum Laufen zu bringen:

Zuerst folgende Einstellungen in die application.ini (sind die Verbindungsdaten für die Datenbank):

db.host = localhost
db.username = root
db.password = password
db.dbname = my_db
db.driver = Pdo_Mysql

Danach diese Methode in die Bootstrap.php:

    protected function _initDb()
    {
        $dbConfig = $this->getOption('db');

        $db = Zend_Db::factory($dbConfig['driver'], array(
            'host'      => $dbConfig['host'],
            'username'  => $dbConfig['username'],
            'password'  => $dbConfig['password'],
            'dbname'    => $dbConfig['dbname'],
        ));

        return $db;
    }

Hier werden die DB Zugangsdaten ausgelesen und eine neue Datenbankverbindung per Zend_DB erstellt. Doctrine hat nämlich auch die Möglichkeit, bestehende Verbindungen, welche per PDO erstellt wurden, zu verwenden.

Jetzt kommen wir zum Doctrine Setup, ebenfalls in die Bootstrap.php NACH _initDb():

    protected function _initEntityManager()
    {
        require_once('Doctrine/Common/ClassLoader.php');

        $classLoader = new \Doctrine\Common\ClassLoader('Doctrine');
        $classLoader->setIncludePath(realpath(APPLICATION_PATH . '/../library/'));
        $classLoader->register();

        $config = new \Doctrine\ORM\Configuration();

        $cache = new \Doctrine\Common\Cache\ArrayCache();

        $config->setMetadataCacheImpl($cache);
        $config->setProxyDir(realpath(APPLICATION_PATH . '/proxies'));
        $config->setProxyNamespace('App\Proxies');
        $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver(realpath(APPLICATION_PATH . '/models')));
        $config->setAutoGenerateProxyClasses(true);
        // (01)
        $config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSqlLogger());

        $connectionOptions = array(
           // (02)
            'pdo' => $this->getResource('db')->getConnection(),
        );

        $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
        // (03)
        $em->getConnection()->setCharset('UTF8');

        // 04
        Zend_Registry::set('entityManager', $em);
    }

Wichtig ist, das im application Verzeichnis die Ordner /proxies (hier speichert Doctrine generierte Proxy Klassen ab) und /models (hier werden die DB Models abgelegt) existieren.

Folgende Anmerkungen noch zu den Fußnoten im Code:

  • 01: Diese Zeile reinnehmen wenn die von Doctrine generierten SQL Abfragen ausgegeben werden sollen
  • 02: Hier die in _initDb() erstellte DB Verbindung nutzen – getConnection() gibt das PDO Connection Objekt zurück
  • 03: Reinnehmen wenn die Daten in der DB UTF-8 encoded sind
  • 04: Ganz auf simpel und Ugly: den entityManager in der ZendRegistry ablegen – man könnte den entityManager ($em) auch aus der _initEntityManager Methode zurückgeben, dann würde dieser in einem Controller via $this->getInvokeArg('bootstrap')->getResource('entityManager') zur Verfügung stehen.

Comment » | Doctrine, PHP, Zend Framework

Back to top