Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-04-2010 15:51:47

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

[Résolu] Doctrine et Autoloader

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:

Code:

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 !!

Code:

( ! ) 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)


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#2 20-04-2010 18:42:12

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu] Doctrine et Autoloader

tu as bien rajouter les namespaces 'Doctrine_' et 'Doctrine'  dans ton bootstrap?

Code:

$autoloader->registerNamespace('Doctrine_');
$autoloader->registerNamespace('Doctrine');

Dernière modification par throrin19 (20-04-2010 18:43:48)

Hors ligne

 

#3 21-04-2010 10:11:03

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [Résolu] Doctrine et Autoloader

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.... rollroll

Par contre, je ne les ai pas ajoutés dans le Bootstrap mais directement dans le fichier de config, comme ceci:

Code:

autoloaderNamespaces[] = "Doctrine"
autoloaderNamespaces[] = "Doctrine_"

Merci pour l'éclairage de ma lanterne


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#4 21-04-2010 10:37:14

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu] Doctrine et Autoloader

tu peux aussi comme ça smile

De rien, il faut que je rajoute un avertissement sur ces deux lignes

Hors ligne

 

#5 21-04-2010 13:06:48

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [Résolu] Doctrine et Autoloader

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...

http://img340.imageshack.us/img340/5397/capture1q.png


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#6 21-04-2010 19:20:28

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu] Doctrine et Autoloader

La structure de ton dossier models est comment? (fait un tree du répertoire)

Hors ligne

 

#7 22-04-2010 09:07:11

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [Résolu] Doctrine et Autoloader

Bon, j'avance un peu, voici quand même la structure de mon dossier application

Code:

|--   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:

Code:

$autoLoader->addResourceType('Model', 'models', 'Models');

Mais j'ai la même erreur...


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#8 22-04-2010 10:24:32

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu] Doctrine et Autoloader

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

 

#9 22-04-2010 11:12:40

Asfaloth
Membre
Lieu: Bruxelles
Date d'inscription: 13-05-2008
Messages: 83
Site web

Re: [Résolu] Doctrine et Autoloader

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


La capacité d'apprendre est un don.
La faculté d'apprendre est un talent.
La volonté d'apprendre est un choix.
-=[ Frank Herbert ]=-

Hors ligne

 

#10 22-04-2010 12:06:02

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [Résolu] Doctrine et Autoloader

De rien voyons, c'est normal smile

Hors ligne

 

#11 23-06-2010 15:49:28

Gaetan
Nouveau membre
Date d'inscription: 15-04-2010
Messages: 2
Site web

Re: [Résolu] Doctrine et Autoloader

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 :

Code:

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


Iosos - Création de site internet sur mesure

Hors ligne

 

#12 24-06-2010 09:00:20

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu] Doctrine et Autoloader

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. :

Code:

<?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:

Code:

pluginPaths.Tight_Application_Resource = APPLICATION_PATH "/../lib/Tight/Application/Resource"

Ensuite il faut configurer Doctrine dans le fichier ini toujours :

Code:

;====== 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.

Code:

$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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#13 24-06-2010 09:57:36

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Résolu] Doctrine et Autoloader

Un petit bout de code pour que la ressource lise les attributs Doctrine :

Code:

if (isset($options['attributes'])) {
    foreach ($options['attributes'] as $key => $value) {
        $manager->setAttribute(constant("Doctrine_Core::$key"), $value);
    }
}

Ainsi on peut faire dans son .ini :

Code:

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


----
Gruiiik !

Hors ligne

 

#14 25-06-2010 12:54:29

Gaetan
Nouveau membre
Date d'inscription: 15-04-2010
Messages: 2
Site web

Re: [Résolu] Doctrine et Autoloader

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


Iosos - Création de site internet sur mesure

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