2010-07-24 3 views
8

si j'intègre Zend Framework 1.10 avec Doctrine 2 où dois-je mettre mes Doctrine Models/Entities et Proxies? J'ai pensé aux /application ou aux répertoires /library. Si je mets dans le répertoire /library tho, va-t-il interférer avec les classes de chargement automatique ZF à partir de là puisque les classes utiliseront des espaces de noms PHP 5.3 vs des espaces de noms de style PEAR.Intégration de ZF/Doctrine2: Où dois-je mettre mes classes Models/Entities & Proxy

Répondre

8

Je travaille sur une application qui intègre également Doctrine 2 avec ZF1.10. Vous n'avez pas du tout besoin d'utiliser le chargeur automatique Doctrine.

1) Dans votre fichier application.ini ajoutez la ligne suivante (en supposant que vous avez Doctrine installé dans votre dossier de bibliothèque (le même que le dossier Zend):

autoloadernamespaces.doctrine = "Doctrine" 

2) Créer une doctrine ou d'une ressource entitymanager. Dans votre fichier ini:

resources.entitymanager.db.driver = "pdo_mysql" 
resources.entitymanager.db.user = "user" 
resources.entitymanager.db.dbname = "db" 
resources.entitymanager.db.host = "localhost" 
resources.entitymanager.db.password = "pass" 
resources.entitymanager.query.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.cache = "Doctrine\Common\Cache\ApcCache" 
resources.entitymanager.metadata.driver = "Doctrine\ORM\Mapping\Driver\AnnotationDriver" 
resources.entitymanager.metadata.proxyDir = APPLICATION_PATH "/../data/proxies" 
resources.entitymanager.metadata.entityDir[] = APPLICATION_PATH "/models/entity" 

3) Ensuite, vous devrez l'amorcer. J'ai ajouté une classe de ressources dans mon dossier de ressources. Assurez-vous que vous associez le dossier dans votre fichier ini:

pluginPaths.Application_Resource_ = APPLICATION_PATH "/resources" 

Ensuite, votre classe de ressource ...

class Application_Resource_EntityManager 
extends Zend_Application_Resource_ResourceAbstract 
{ 
    /** 
    * @var Doctrine\ORM\EntityManager 
    */ 
    protected $_em; 

    public function init() 
    { 
     $this->_em = $this->getEntityManager(); 
     return $this->_em; 
    } 

    public function getEntityManager() 
    { 
     $options = $this->getOptions(); 
     $config = new \Doctrine\ORM\Configuration(); 
     $config->setProxyDir($options['metadata']['proxyDir']); 
     $config->setProxyNamespace('Proxy'); 
     $config->setAutoGenerateProxyClasses((APPLICATION_ENV == 'development')); 
     $driverImpl = $config->newDefaultAnnotationDriver($options['metadata']['entityDir']); 
     $config->setMetadataDriverImpl($driverImpl); 
     $cache = new Doctrine\Common\Cache\ArrayCache(); 
     $config->setMetadataCacheImpl($cache); 
     $config->setQueryCacheImpl($cache); 

     $evm = new Doctrine\Common\EventManager(); 
     $em = Doctrine\ORM\EntityManager::create($options['db'],$config,$evm); 

     return $em; 
    } 
} 

Le directeur de l'entité doctrine 2 est maintenant disponible pour votre application. Dans votre contrôleur, vous pouvez la saisir comme ceci:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$em = $bootstrap->getResource('entitymanager'); 

Je suis sûr que cela va aider quelqu'un :)

+0

et qu'en est-il des dépôts? @Entity (repositoryClass = "Entities \ ArticlesRepository") Je ne peux pas les charger. :( – cirpo

+0

En tant que FYI, je n'ai pas encore eu l'occasion d'utiliser cette fonctionnalité (j'étais trop occupé avec Magento). La valeur de la classe repositorClass doit être un nom de classe complet qui étend Doctrine \ ORM \ EntityRepository – David

+0

De plus, vous devez savoir que l'exemple que vous avez est une classe namespaced. essayez d'y mettre le nom complet de la classe (exemple: Module_Model_Entities_ArticlesRepository). – David

0

Je mettrais les modèles dans le même répertoire où la vie «normale» de Zend Framework. /models

Vous pouvez indiquer à Doctrine de générer les modèles à cet endroit et les préfixer avec "Default_Model" ou autre.

Découvrez un des John Lebenshold screencasts sur Zend Framework et Doctrine

Zend Screencasts

+0

j'utilise Doctrine 2 qui utilise PHP 5.3 namespaces « vrai », je ne pense pas que je peux le faire ? comment puis-je dire à l'autoloader de zend de charger mes «Entities» et «Proxies» à partir de «APPLICATION_PATH»?J'ai réussi à le faire fonctionner en mettant mes entités et proxies dans 'library/Application' où ils sont dans le chemin d'inclusion afin que cela fonctionne –

1

En théorie, vous pourriez mettre alors partout, aussi longtemps que les namespaces résolvent correctement.

je suggère cette structure:

/application/models/MyApp/Entities 
/application/models/MyApp/Proxies 

Chargez le 'MyApp' en utilisant la ClassLoader Doctrine. Je n'ai eu aucun conflit en utilisant le chargeur Doctrine avec le Zend Loader (si vous avez des classes qui utilisent la convention PEAR dans votre dossier d'espace de noms, vous aurez toujours besoin d'utiliser Zend Loader). Rappelez-vous que les «modèles» peuvent être plus que vos classes Entité. Ma couche de modèle se compose d'interfaces, d'usines, de valideurs et d'objets de service. À cette fin, tout ce qui est une logique métier spécifique à l'application devrait probablement aller dans le dossier modèle.

+0

comment configurer le chargeur de classe Doctrine pour travailler avec zend autoloader? Je place actuellement mes entités dans le dossier '/ library/Application'. puis dans application.ini a ajouté 'autoloaderNamespaces [] = Application'. cela fonctionne bien car Zend Loader semble pouvoir fonctionner avec les espaces de noms PHP 5.3, mais je ne peux pas l'obtenir pour charger des classes à partir de quelque part en dehors du 'include_path's. il sera bon de savoir comment je peux le faire avec Doctrine class loader et Zend (en spécifiant un emplacement personnalisé pour trouver les fichiers) –

+0

Voir cette section du manuel: http://www.doctrine-project.org/projects/orm/ 2.0/docs/reference/configuration/fr # bootstrapping: chargement de la classe: git Fondamentalement, vous pouvez utiliser ClassLoader de Doctrine pour charger n'importe quel espace de noms PHP 5.3. Il suffit de fournir le nom de l'espace de nom de base (comme 'Doctrine' ou 'MyApp', et un chemin vers le dossier.) Vous pouvez alors importer n'importe quelle classe d'espace de noms avec le mot clé 'use' –

+0

ajouter le chargeur de classe Doctrine en tant que chargeur de classe à mon application Zend? –

Questions connexes