Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Sujet à la mode, je me lance doucement dans l'intégration entre ZF et Doctrine. Histoire d'être paré au futur.
Mais c'est le drame dès les 3 premières lignes de code...
J'ai suivis le tuto de throrin19 sur le fofo, et le Zend Cast en parlant. Mais je suis coincé au tout début.
Le pire c'est que j'ai l'impression que c'est une connerie, mais mon neurone n'arrive pas à se mettre en route.
Je fais donc la feignasse et poste le code problématique ^^
Donc c'est un projet ZF tout simple, presque rien de modifié depuis la génération par Zend_Tool.
J'ajoute simplement ceci à mon bootstrap:
protected function _initDoctrine() { $this->getApplication()->getAutoloader() ->pushAutoloader(array('Doctrine', 'autoload')); spl_autoload_register(array('Doctrine', 'modelsAutoload')); $manager = Doctrine_Manager::getInstance (); }
Et c'est le drame !!
( ! ) Warning: call_user_func(Doctrine::autoload) [function.call-user-func]: First argument is expected to be a valid callback in /home/www/lgb/library/Zend/Loader/Autoloader.php on line 130 Call Stack # Time Memory Function Location 1 0.0004 58312 {main}( ) ../index.php:0 2 0.0393 866228 Zend_Application->bootstrap( ) ../index.php:25 3 0.0393 866400 Zend_Application_Bootstrap_BootstrapAbstract->bootstrap( ) ../Application.php:355 4 0.0393 866532 Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap( ) ../BootstrapAbstract.php:582 5 0.1120 1929876 Zend_Application_Bootstrap_BootstrapAbstract->_executeResource( ) ../BootstrapAbstract.php:618 6 0.1121 1930344 Bootstrap->_initDoctrine( ) ../BootstrapAbstract.php:665 7 0.1122 1931932 spl_autoload_register ( ) ../Bootstrap.php:16 8 0.1122 1932388 Zend_Loader_Autoloader::autoload( ) ../Autoloader.php:0 9 0.1125 1933580 call_user_func ( ) ../Autoloader.php:130 Dump $_POST ( ! ) LogicException: Passed array does not specify an existing static method in /home/www/lgb/application/Bootstrap.php on line 16 Call Stack # Time Memory Function Location 1 0.0004 58312 {main}( ) ../index.php:0 2 0.0393 866228 Zend_Application->bootstrap( ) ../index.php:25 3 0.0393 866400 Zend_Application_Bootstrap_BootstrapAbstract->bootstrap( ) ../Application.php:355 4 0.0393 866532 Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap( ) ../BootstrapAbstract.php:582 5 0.1120 1929876 Zend_Application_Bootstrap_BootstrapAbstract->_executeResource( ) ../BootstrapAbstract.php:618 6 0.1121 1930344 Bootstrap->_initDoctrine( ) ../BootstrapAbstract.php:665 7 0.1122 1931932 spl_autoload_register ( ) ../Bootstrap.php:16
Mon chemin Pour doctrine se trouve bien comme ceci:
/Library
|
/Doctrine/
/vendor/
/Doctrine.php
Merci à l'âme charitable qui sortira mon neurone de la mélasse ^^
Bonne Journée à tous,
Dernière modification par Asfaloth (22-04-2010 11:13:14)
Hors ligne
tu as bien rajouter les namespaces 'Doctrine_' et 'Doctrine' dans ton bootstrap?
$autoloader->registerNamespace('Doctrine_'); $autoloader->registerNamespace('Doctrine');
Dernière modification par throrin19 (20-04-2010 18:43:48)
Hors ligne
Et bien voilà, aujourd'hui mon neurone est en route, ça va tout de suite mieux..
En effet, j'avais oublié d'ajouter les namespaces....
Par contre, je ne les ai pas ajoutés dans le Bootstrap mais directement dans le fichier de config, comme ceci:
autoloaderNamespaces[] = "Doctrine" autoloaderNamespaces[] = "Doctrine_"
Merci pour l'éclairage de ma lanterne
Hors ligne
tu peux aussi comme ça
De rien, il faut que je rajoute un avertissement sur ces deux lignes
Hors ligne
J'en profite pour te poser la question.
Maintenant tout roule, j'ai mes class générées, tout est beau dans le meilleur des mondes.
Histoire de suivre ton tuto jusqu'au bout, je fais la fonction fetchAll() dans une de mes tables, et l'appelle dans mon controlleur.
Rebelotte, Drame...
Et Drame qui me semble logique, je fais ça sur ma table Role, donc il veut appeler la class BaseRole située dans le dossier generated... Sauf que le loader me sort une erreur car il ne trouve pas la class Model_BaseRole
Logique si on suit la logique du loader du ZF, la class devrait se nommer Model_Generated_BaseRole ...
Je sais qu'on a chargé le loader de Doctrine dasn le boostrap mais apparement il y a petit soucis...
Hors ligne
La structure de ton dossier models est comment? (fait un tree du répertoire)
Hors ligne
Bon, j'avance un peu, voici quand même la structure de mon dossier application
|-- configs | |-- data | | |-- fixtures | | `-- sql | `-- migrations |-- controllers |-- layouts | `-- scripts |-- models | |-- Blog | |-- Event | |-- Photo | |-- Preference | |-- Role | |-- Survey | |-- User | `-- generated | |-- BaseBlog | |-- BaseEvent | |-- BasePhoto | |-- BasePreference | |-- BaseRole | |-- BaseSurvey | `-- BaseUser |-- scripts `-- views |-- helpers `-- scripts |-- error `-- index
J'ai du mal avec l'autoload, je sais que c'est de là que viens le problème mais je n'arrive pas à le configurer correctement...
J'ai essayer de renommer mes class en Models_Role et de rajouter ceci à mon bootstrap:
$autoLoader->addResourceType('Model', 'models', 'Models');
Mais j'ai la même erreur...
Hors ligne
cherche pas.
J'ai trouvé, tu as pas suivi à la lettre mon tuto. En plus c'est pas conforme avec la convention PEAR et Zend se base dessus pour trouver les fichiers.
Tesclasses BaseXXX sont dans generated. C'est une erreur.
Renomme tes classes juste XXX (pour le nom de fichier.
Renomme ton dossier generated en Base
Renomme tes classes BaseXXX en Models_Base_XXX (et corrige le extends de celles qui sont dans le dossier parent). Cela devrait déjà mieux marcher.
Relis bien mon tuto, j'explique tout et il te manque les XXXTable.
Hors ligne
Ok, j'ai (encore) fait le boulet sur ce coup là...
Ça m'apprendra à pas faire de copy-paste quand je fais les tutos pour soi-disant, mieux comprendre...
Il me manquait effectivement 2 lignes dans mon config pour:
- virer le dossier generated
- ajouter le prefix Base_
Merci encore pour ton aide Throrin,
Maintenant c'est bon, je peux mettre en résolu ^^
Bonne journée
Hors ligne
De rien voyons, c'est normal
Hors ligne
Bonjour, je me permets de relancer le sujet et j'ai également un soucis avec l"utilisation de Doctrine et Zend j'ai suivi ce tuto et arrivé à la commande php doctrine.php j'ai l'erreur suivante :
C:\wamp\www\ZendModule\application\scripts>php Doctrine.php PHP Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Resource matching "doctrine" not found' in C:\wamp\www\ZendModule\libr ary\Zend\Application\Bootstrap\BootstrapAbstract.php:691 Stack trace: #0 C:\wamp\www\ZendModule\library\Zend\Application\Bootstrap\BootstrapAbstract.p hp(626): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('doctrin e') #1 C:\wamp\www\ZendModule\library\Zend\Application\Bootstrap\BootstrapAbstract.p hp(583): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap('doctrine') #2 C:\wamp\www\ZendModule\application\scripts\Doctrine.php(32): Zend_Application _Bootstrap_BootstrapAbstract->bootstrap('doctrine') #3 {main} thrown in C:\wamp\www\ZendModule\library\Zend\Application\Bootstrap\BootstrapA bstract.php on line 691
Je vous remercie d'avance
PS : je travail avec zend 1.10.5 / doctrine 1.2.2 wampserver 2 sous XP PRO SP3
Hors ligne
Salut,
Zend essaie de charger un plugin de resource qui n'existe pas (Xxxx_Application_Resource_Doctrine).
Il faut, si ce n'est pas fait, créer ton plugin, un ex. :
<?php /** * Doctrine resource * * @category Tight * @package Tight_Application * @subpackage Resource * @author Benjamin Dulau */ class Tight_Application_Resource_Doctrine extends Zend_Application_Resource_ResourceAbstract { /** * @var Doctrine_Manager */ protected $_manager; protected $_options = array(); /** * Initialize Doctrine * * @return Doctrine_Manager */ public function init() { $this->_options = $this->getOptions(); $autoloader = $this->getBootstrap()->getApplication()->getAutoloader(); $autoloader->pushAutoloader(array('Doctrine_Core', 'autoload')); spl_autoload_register(array('Doctrine_Core', 'modelsAutoload')); $manager = Doctrine_Manager::getInstance(); $manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true); $manager->setAttribute( Doctrine_Core::ATTR_MODEL_LOADING, Doctrine_Core::MODEL_LOADING_CONSERVATIVE ); $manager->setAttribute(Doctrine_Core::ATTR_AUTOLOAD_TABLE_CLASSES, true); //$manager->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFIER, true); // connections foreach ($this->_options['dsn'] as $name => $dsn) { //$manager->openConnection($dsn, $con_name); $conn = $manager->connection($dsn, $name); $conn->setAttribute(Doctrine_Core::ATTR_USE_NATIVE_ENUM, true); $conn->setCharset('utf8'); } //$dsn = $this->_options['dsn']; return $manager; } }
J'en profite pour préciser qu'il faut utiliser Doctrine_Core et non pas Doctrine qui devient obsolète. D'ailleurs depuis la 1.2.2 si vous n'utilisez pas Doctrine_Core dans le plugin, vous serez parfois ennuyés pour le chargement des classes Doctrine.
Ensuite, il faut préciser a Zend_Application qu'il doit utiliser ce plugin en lui indiquant le chemin vers les plugins perso :
application.ini:
pluginPaths.Tight_Application_Resource = APPLICATION_PATH "/../lib/Tight/Application/Resource"
Ensuite il faut configurer Doctrine dans le fichier ini toujours :
;====== Resource Doctrine autoloaderNamespaces[] = "Doctrine" resources.doctrine.dsn.default = "mysql://user:password@127.0.0.1/dbname" resources.doctrine.dsn.front = "mysql://user:password@127.0.0.1/dbname2" resources.doctrine.data_fixtures_path = APPLICATION_PATH "/../etc/db/data/fixtures" resources.doctrine.sql_path = APPLICATION_PATH "/../etc/db/data/sql" resources.doctrine.migrations_path = APPLICATION_PATH "/../etc/db/migrations" resources.doctrine.yaml_schema_path = APPLICATION_PATH "/../etc/db/models.yml" resources.doctrine.models_path = APPLICATION_PATH "/domain/models" resources.doctrine.generate_models_options.pearStyle = true resources.doctrine.generate_models_options.generateTableClasses = false resources.doctrine.generate_models_options.baseClassPrefix = Entity_ resources.doctrine.generate_models_options.baseClassesDirectory = null resources.doctrine.generate_models_options.classPrefix = Model_ resources.doctrine.generate_models_options.classPrefixFiles = false resources.doctrine.generate_models_options.generateBaseClasses = true
Ensuite il faut utiliser le style Pear pour la manipulation des models.
Ex.
$user = Doctrine_Query::create() ->from('Model_User u') ->where('u.login = ?', 'toto') ->fetchOne();
Benjamin Eberlei a fait une première proposition pour l'intégration complète (et bien plus approfondie que nos pauvres plugins) de Doctrine 1.2 dans ZF, c'est intéressant de regarder ce qu'il a fait, voir de tester pour faire des retours.
http://groups.google.com/group/doctrine … 1ba95e912f
http://github.com/beberlei/zf-doctrine
A+ benjamin.
Hors ligne
Un petit bout de code pour que la ressource lise les attributs Doctrine :
if (isset($options['attributes'])) { foreach ($options['attributes'] as $key => $value) { $manager->setAttribute(constant("Doctrine_Core::$key"), $value); } }
Ainsi on peut faire dans son .ini :
resources.doctrine.attributes.ATTR_AUTO_ACCESSOR_OVERRIDE = 1 resources.doctrine.attributes.ATTR_MODEL_LOADING = Doctrine_Core::MODEL_LOADING_PEAR resources.doctrine.attributes.ATTR_AUTOLOAD_TABLE_CLASSES = 1 resources.doctrine.attributes.ATTR_MODEL_CLASS_PREFIX = "Model_" resources.doctrine.attributes.ATTR_USE_NATIVE_ENUM = 1
de plus, je n'ai pas la nécessite de faire spl_autoload_register(array('Doctrine_Core', 'modelsAutoload'));
Mes models respectes Pear et donc Zend sait les chargés lui même
Hors ligne
Bonjour,
Merci pou vos réponses je regarde également la documentation que m'a proposé Delprog. Je reviendrais sur le forum encas de soucis.
Merci encore
Hors ligne