Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
[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 :
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 :
[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 :
[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
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
Pages: 1