Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 07-04-2010 09:21:18

pierre
Nouveau membre
Date d'inscription: 21-04-2009
Messages: 7

[Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Bonjour,
Je travaille sur un projet assez important et j'ai décidé d'intégrer Doctrine (1.2) à Zend Framework (1.9).
Malheureusement, il me reste quelques points que je n'ai pas réglés et pour lesquels je suis preneur d'informations :
* Comment utilisez-vous plusieurs base de données (ie plusieurs bases de MySQL) : paramétrage et exploitation ?
* Comment faites-vous pour avoir plusieurs arborescences pour les models Doctrine (ie par défaut tous les models générés se trouvent dans mon répertoire models avec les classes dont ils dérivent dans le répertoire generated, je souhaite avoir un répertoire par base de données à l'intérieur desquels je retrouve les models et le répertoire generated associé) ?
* Comment profilez_vous les requêtes de Doctrine via les extensions Firefox (Firebug et FirePHP et pas via l'utilisation de ZFDebug) et surtout, si c'est possible comment profilez uniquement un model (d'où la volonté de ne pas passer par ZFDebug)?
Merci d'avance pour vos réponses.
Cordialement - Pierre

Dernière modification par pierre (08-04-2010 14:20:14)

Hors ligne

 

#2 07-04-2010 09:47:36

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

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

- 1 -
J'utilise une resource, donc, dans mon application.ini ca donne qqchose comme

Code:

resources.doctrine.dsn.john          = "dblib://login:passwd@192.168.1.1:1433/mabase"
resources.doctrine.dsn.doe           = "mysql://login:passwd@192.168.1.12/mabase"

Puis, via le schema, je définis l'option connexion en donnant le nom de la connexion (ici john ou doe)

- 2 -
Je n'ai pas plusieurs aborescence, puisque doctrine selectionne tout seul la connexion approrié
Mais regarde les options concernant la génération de type PEAR de Doctirne

- 3 -
J'utilise ZFDebug avec un plugin ZFDebug pour doctrine


----
Gruiiik !

Hors ligne

 

#3 07-04-2010 10:19:04

pierre
Nouveau membre
Date d'inscription: 21-04-2009
Messages: 7

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Merci nORKy pour ta réponse ..

Reste que :

1 ok pour :
application.ini qui va contenir dans mon cas :

Code:

doctrine.dsn.base1 = "mysql://ident:pwd@localhost/base1"
doctrine.dsn.base2 = "mysql://ident:pwd@localhost/base2"

pour schema.yml :

Code:

Base1Table1:
  connexion: base1
  columns: ...

mais comment paramétrer Doctrine dans le bootstrap ie que devient le code suivant que j'avais quand j'avais une seule base (ie doctrine.dsn dans application.ini) :

Code:

$conn = Doctrine_Manager::connection($doctrineConfig['dsn'], 'doctrine');

2 pas de problème pour moi de laisser l'arborescence par défaut mais l'existant à environ 75 tables .. est-ce judicieux de laisser en l'état ou est-il préférable de regarder vers la génération type PEAR ?

3 j'ai trouvé ça http://taat.pl/article/zend_framework_tutorial/step5/, mais c'est loin d'être clair pour moi et encore moins facile de comprendre si je peux fonctionner comme je souhaite ie ne pas activer le debug sur l'ensemble du projet mais sur un model ou alors sur un controller

Merci d'avance

Hors ligne

 

#4 07-04-2010 10:45:35

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

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

- 1 -
Rooh..T'as oublié la fonction "réfléchir" en te levant ce matin ?!  :p

Code:

foreach ($options['dsn'] as $con_name => $dsn) {
      $manager->openConnection($dsn, $con_name);
}

- 2 -
Avec le model PEAR, normalement, en fonction du nom de tes models, Doctrine te créera automatiquement les répertoires. Par exemple User_Profile_Data, sera dans User/Profile/Data, suffit juste de bien paramètré les options.
mes options :

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
resources.doctrine.generate_models_options.pearStyle                   = true
resources.doctrine.generate_models_options.baseClassPrefix         = Base_
resources.doctrine.generate_models_options.classPrefix                = Model_
resources.doctrine.generate_models_options.classPrefixFiles          = false

Je te laisse te référencé à la doc pour avoir l'explication précise de toutes les options
En gros, ca me génère tous dans application/Models avec les classes commençant par Model_

- 3 -
Je n'utilise pas firephp, et je ne debug pas Doctrine dans firephp mais dans ZFDebug, alors je ne peux pas t'aider/conseiller. (par contre ,j'utilise aussi Zend_Log mais pas avec firephp)


----
Gruiiik !

Hors ligne

 

#5 07-04-2010 11:09:14

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

1 - Réponse donné par nORky

Code:

$manager = Doctrine_Manager::getInstance();
$manager->setCurrentConnection("db");

Ce code te permet de définir une base de donnée par défaut et sera donc utiliser pour les models qui n'ont pas de liaison explicite vers une base de donnée.

- 2 : Point faible de Doctrine 1.2, la génération des ClassTable doit être dans le même répertoire que tes models sad

Code:

resources.doctrine.generate_models_options.tableClassFormat = %sTable

Ceci est le nom par défaut des ClassTable, tu peut faire un teste et mettre Table_%s, tu va avoir les yeux qui brillent car un répertoire /Table sera créé dans /models et le nom de ta classe sera correctement donnée : Model_Table_User.
Sauf que l'utilisation de l'option suivante ne fonctionnera plus, ni le chargement explicite sad

Code:

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_AUTOLOAD_TABLE_CLASSES, true);

Cela est dû à l'autoloader de Doctrine 1.2 qui n'est pas configuré pour tenir compte de l'option tableClassFormat

Sachant que Doctrine 1 a été gelé en terme de nouvelles fonctionnalités, ne l'attend pas pour les prochaines release de 1.X...

C'est moche de mettre les EntityTable au même niveau que les Entity, mais tu n'as pas le choix avec Doctrine 1.X

3 - J'utilise pas non plus.

Hors ligne

 

#6 07-04-2010 11:53:34

pierre
Nouveau membre
Date d'inscription: 21-04-2009
Messages: 7

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Merci à tous les deux pour vos réponses ..

1. pas encore gagné ..
2. pour passage à ZF 2 avec Doctrine 2
3. comment mettre les query dans les log de Zend ?

Pour information : je donne mon retour dès que 1 est fonctionnel, idem pour 3 mais pas ma priorité ..

Hors ligne

 

#7 07-04-2010 16:53:55

pierre
Nouveau membre
Date d'inscription: 21-04-2009
Messages: 7

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Bon, je galère comme un "con" ...
Comme dit nORKy, j'ai oublié la fonction "réfléchir" en me levant ce matin !!

application.ini

Code:

doctrine.dsn.base1    = "mysql://ident:pwd@localhost/base1"
doctrine.dsn.base2    = "mysql://ident:pwd@localhost/base2"

bootstrap.php

Code:

..
    protected function _initDoctrine()
    {
        $this->getApplication()->getAutoloader()
            ->pushAutoloader(array('Doctrine', 'autolad'));
        spl_autoload_register(array('Doctrine', 'modelsAutoload'));
        
        $manager = Doctrine_Manager::getInstance();
        $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
        $manager->setAttribute(
            Doctrine::ATTR_MODEL_LOADING,
            Doctrine::MODEL_LOADING_CONSERVATIVE
        );
        $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);
        
        $doctrineConfig = $this->getOption('doctrine');
        
        Doctrine::loadModels($doctrineConfig['models_path']);
        
        foreach ($doctrineConfig['dsn'] as $name => $dsn) {
            $conn = $manager->connection($dsn, $name);
            $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
        }
        
        return $conn;
    }
..

dans les fichiers generated j'ajoute avant l'abstract class :

Code:

Doctrine_Manager::getInstance()->bindComponent('Table', 'base');

le model qui lie les deux tables

Code:

class Table1 extends BaseTable1
{
    public static function findAll()
    {
        return Doctrine_Query::create()
        ->select('t1.Ident, t2.Nom')
        ->from('Table1 t1')
        ->leftJoin('t1.Table2 t2')
    ->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
    }
}

Si mes deux tables sont dans la même base

Code:

Doctrine_Manager::getInstance()->bindComponent('Table1', 'base1');

Doctrine_Manager::getInstance()->bindComponent('Table2', 'base1');

si elles sont dans deux bases différentes

Code:

Doctrine_Manager::getInstance()->bindComponent('Table1', 'base1');

Doctrine_Manager::getInstance()->bindComponent('Table2', 'base2');

Ca plante ..

Hors ligne

 

#8 08-04-2010 14:19:29

pierre
Nouveau membre
Date d'inscription: 21-04-2009
Messages: 7

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Finalement ..

Dans les fichiers generated j'ajoute avant l'abstract class :

Code:

Doctrine_Manager::getInstance()->bindComponent('Table', 'base');

mais aussi je modifie le setTableName du setTableDefinition :

Code:

public function setTableDefinition()
{
    $this->setTableName('Table');

qui devient :

Code:

public function setTableDefinition()
{
    $this->setTableName('base.Table');

Idem si je passe par schema.yml, il ne suffit pas de rajouter la ligne connection mais de le signaler au niveau du nom de table :

Code:

Table:
  tableName: Table
  ..

qui devient :

Code:

Table:
  tableName: base.Table
  connection: base
  ..

Hors ligne

 

#9 12-04-2010 09:16:05

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

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Désolé, j'étais "absent".

En effet, quand tu as plusieurs connexions, il faut précisée à quelle connexion est ratachée une table via l'option 'connection"
cf doc : http://www.doctrine-project.org/documen … on-binding


----
Gruiiik !

Hors ligne

 

#10 12-04-2010 09:57:14

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

C'est bon à savoir.

Hors ligne

 

#11 12-04-2010 11:45:09

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

Re: [Résolu] Exploitation de Doctrine (1.2) avec Zend Framework (1.9)

Par contre, le fait de changer le nom des tables n'est juste qu'un coté "pratique" pour l'utilisateur, puisque l'option "connection" permet justement à doctrine de faire la part des choses


----
Gruiiik !

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