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