Doctrine 2 ins Zend Framework integrieren
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.