Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-06-2011 12:40:55

fhebert
Membre
Date d'inscription: 30-11-2010
Messages: 20

[ZF 1.11.3] Doctrine 1.2.4 et ZF resource loader

Bonjour,

je cherche à me passer complètement de l'autoloader de Doctrine et utiliser le resource autoloader de ZF. Jusqu'à présent j'utilisais l'autoloader de Doctrine avec le code suivant dans mon Bootstrap.php :

Code:

   
[lang=php]
 protected function _initDoctrine()
    {

        /**
         * Make sure the zend autoloader have access to models
         * classes
         */
        $this->bootstrap('appload');
        #$this->bootstrap('module');
    
        
        $doctrineConfig = $this->getOption('doctrine');

        $manager = Doctrine_Manager::getInstance();
        $manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING, $doctrineConfig['model_autoloading']);
        $manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
        $manager->setAttribute(Doctrine_Core::ATTR_MODEL_CLASS_PREFIX, 'Publications_Model_');

        $connection = $manager->connection($doctrineConfig['dsn'], 'publications');
        $connection->setCharset('UTF8');

        $this->getApplication()->getAutoloader()->pushAutoloader(array('Doctrine_Core', 'autoload'));

        Doctrine_Core::setModelsDirectory(realpath(dirname(__FILE__) . '/modules/Publications/models'));
        Doctrine_Core::loadModels($doctrineConfig['models_path']);

        return $connection;
    }

Par défaut j'ai l'impression que le resource autoloader est correctement configuré pour trouver les différentes classes de Doctrine.

voici le layout du dossier models de mon module Publications :

Code:

fhebert@neo102:/srv/www/publications.ehess.fr/application/modules/Publications/models$ tree 
.
├── Author.php
├── AuthorTable.php
├── Base
│   ├── Author.php
│   ├── BookAuthor.php
│   ├── Book.php
│   ├── BookPublisher.php
│   ├── Center.php
│   ├── Collection.php
│   ├── Currency.php
│   ├── Identifier.php
│   ├── IdentifierType.php
│   ├── Notice.php
│   ├── NoticeStatus.php
│   ├── Price.php
│   ├── Publisher.php
│   ├── Role.php
│   └── Status.php
├── BookAuthor.php
├── BookAuthorTable.php
├── Book.php
├── BookPublisher.php
├── BookPublisherTable.php
├── BookTable.php
├── Center.php
├── CenterTable.php
├── Collection.php
├── CollectionTable.php
├── Currency.php
├── CurrencyTable.php
├── Identifier.php
├── IdentifierTable.php
├── IdentifierType.php
├── IdentifierTypeTable.php
├── Notice.php
├── NoticeStatus.php
├── NoticeStatusTable.php
├── NoticeTable.php
├── Price.php
├── PriceTable.php
├── Publisher.php
├── PublisherTable.php
├── Role.php
├── RoleTable.php
├── Status.php
└── StatusTable.php

et le nouveau code de ma méthode _initDoctrine :

Code:

[lang=php]
protected function _initDoctrine()
    {

        /**
         * Make sure the zend autoloader have access to models
         * classes
         */
        $this->bootstrap('appload');
        $this->bootstrap('modules');
    
        $modulesConfig = $this->getResource('modules');
        $messagesConfig = $modulesConfig['Messages'];
        $resourceLoader = $messagesConfig->getResourceLoader();
        $resourceLoader->addResourceType('base', 'models/Base/', 'Model_Base');
        
        $publicationsConfig = $modulesConfig['Publications'];
        $resourceLoader = $publicationsConfig->getResourceLoader();
        $resourceLoader->addResourceType('base', 'models/Base/', 'Model_Base');
        
        $usersConfig = $modulesConfig['Users'];
        $resourceLoader = $usersConfig->getResourceLoader();
        $resourceLoader->addResourceType('base', 'models/Base/', 'Model_Base');
        
        $helpConfig = $modulesConfig['Help'];
        $resourceLoader = $helpConfig->getResourceLoader();
        $resourceLoader->addResourceType('base', 'models/Base/', 'Model_Base');
         
        $doctrineConfig = $this->getOption('doctrine');

        $manager = Doctrine_Manager::getInstance();
        $manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING, $doctrineConfig['model_autoloading']);
        $manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);

        $connection = $manager->connection($doctrineConfig['dsn'], 'publications');
        $connection->setCharset('UTF8');

        return $connection;
    }

Toutes les classes sont bien chargées via le resource autoloader à la demande mais je rencontre un problème avec le chargement des classes étendant Doctrine_Table.

Si je fais un :

Code:

[lang=php]
$multiOptions = Doctrine_Core::getTable('Publications_Model_Center')->getMultiOptions();

sachant que getMultiOptions est une méthode perso bien définie sur Publications_Model_CenterTable, j'obtiens une erreur

Code:

Unknown method Doctrine_Table::getMultiOptions

D'après ce que je comprends Doctrine ne trouvant pas la classe Publications_Model_CenterTable charge par défaut la classe Doctrine_Table
(voir la méthode Doctrine_Connection::getTable()) et du coup PHP ne trouve pas la méthode getMultiOptions.

Visiblement Doctrine n'est pas prévu pour charger les classes "tables" depuis un autoloader externe à Doctrine.

Auriez-vous une piste pour contourner ce problème ?

Le chargement par instanciation directe de ces classes (du genre new Publications_Model_CenterTable()) vous semble t'il une bonne solution ?

Merci beaucoup pour votre aide,

Frédéric

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages