Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2011, 09h31   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 0
Points : 0
Par défaut accessibilité et Propagation de $DB

Bonjour a tous et un grand bravo a ce forum car je trouve ici plein d'information utile a la compréhension de ZF.
je viens de commencer mon apprentissage de ZF et j ai donc réalisé le tuto "débuter avec ZF 1.10 de Rob Allen".
Après avoir fait ce tuto j ai voulu voir si je pouvais faire moi même mes requêtes a la main du genre:

que je place dans application/model/artiste.php

Code :
1
2
3
4
5
6
7
8
9
class Application_Model_Artiste extends Zend_Db_Table
{
    public function listArtiste()
    {
        $result = $db->query('SELECT artiste FROM albums');
        $data =  $result->fetchAll();
        return $data;
    }
}
et la contre tout attente j ai un message d'erreur me disant que query n'est pas un objet donc j en déduit $db que je pensait avoir initialiser dans application.ini n'est accessible de partout dans l application.

Code :
1
2
3
4
5
6
; connexion à une base de données
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password =
resources.db.params.dbname = toto
Donc pour résoudre ça j'ai fait la chose suivante

Dans public/index.php
Code :
1
2
3
4
5
6
7
$params = array (   'host'     => 'localhost',
                    'username' => 'root',
                    'password' => '',
                    'dbname'   => 'toto'
);
$db = Zend_Db::factory('PDO_MYSQL', $params);
Zend_Registry::set('db', $db);
Dans application/model/artiste.php
Code :
1
2
3
4
5
6
7
8
9
10
class Application_Model_Artiste extends Zend_Db_Table
{
    public function listArtiste()
    {
        $db=Zend_Registry::get('db');
        $result = $db->query('SELECT artiste FROM albums');
        $data =  $result->fetchAll();
        return $data;
    }
}
Dans le controller
Code :
1
2
3
$artistee = new Application_Model_Artiste();
$rows = $artistee->listArtiste();
$this->view->lesArtistes = $rows;
et dans la vue
Code :
1
2
3
<?php foreach($this->lesArtistes as $artiste) : ?>
   <?php echo $artiste['artiste']."<br>"; ?>
<?php endforeach; ?>

Ma première question est ce une bonne chose d'écrire soit même les requêtes. En fait j'ai peur d'etre limiter si je me sers des objets disponibles.

Ma deuxième question: est ce la bonne méthode pour rendre accessible dans toute l application $db car avec cette méthode je suis obligé de l appeler a chaque fois avec
Code :
$db=Zend_Registry::get('db');
Par avance merci de toute vos remarques
Séb
dcjones est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 10h39   #2
Membre confirmé
 
Avatar de Nighty
 
Homme Lucas CORBEAUX
Chef de projet MOE
Inscription : février 2003
Messages : 158
Détails du profil
Informations personnelles :
Nom : Homme Lucas CORBEAUX
Âge : 28
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet MOE

Informations forums :
Inscription : février 2003
Messages : 158
Points : 291
Points : 291
Bonjour,

Pour ta première question, je pense qu'il vaut mieux prendre l'habitude de construire soi même ses requêtes en effet : ça permet d'avoir la main sur ce que tu fais, et d'éviter de multiplier les requêtes là où une seule aurait suffit.

Pour le reste, le Quickstart du Zend Framework est un peu velu pour un débutant (un comble, on en conviendra...), mais je te conseille de t'en inspirer : http://framework.zend.com/manual/en/...art.intro.html

Pour répondre à ta deuxième question, à la condition de déclarer un Adapter par défaut pour les Zend_Db_Table, tu peux accéder à ton objet $db depuis toute instance d'un objet Zend_Db_Table grâce à la méthode getAdapter :

Code :
1
2
3
4
5
6
7
8
9
10
class Application_Model_Artiste extends Zend_Db_Table
{
    public function listArtiste()
    {
        $db = $this->getAdapter();
        $result = $db->query('SELECT artiste FROM albums');
        $data =  $result->fetchAll();
        return $data;
    }
}
Je peux me tromper, mais vu que tu as configuré la ressource db dans ton fichier .ini, je pense que la définition de l'adapter par défaut a déjà été faite lors du bootstrap.

Plus d'informations ici : http://framework.zend.com/manual/en/zend.db.table.html
Nighty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 10h41   #3
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
J'ai eu quelque problème avec les requête dans une application alors essai de travailler avec les objets zend, le moment ou tu sera coincé utilise des requête.

pour la deuxième question j'ai chercher et j'ai pas trouver des réponse j'appele avec $db = $this->getAdapter("dbAdapter");

Code :
1
2
3
4
5
6
7
 
     public function listArtiste()
    {
        $db = $this->getAdapter("dbAdapter");
        $result = $db->query('SELECT artiste FROM albums');
        return    $db->fetchAll($result);
    }
et tu pourra utiliser fetchCol dans ton exemple pour ne pas avoir un array à 2 dimension.
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 13h29   #4
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 0
Points : 0
merci pour vos réponse,

donc pour ce qui est des requêtes je pense que je vais faire appel quand c'est possible au objet présent, et quand je bloquerais j'écrirais moi même mes requêtes

pour ce qui de seconde question j ai un avancé en ammeliorant un peu mon code,
premièrement j ai supprimé la déclaration de zend_db dans index.php que j ai ajouté dans le bootstrap.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected function _initDefaultAdaptater()
    {
 
        $config = new Zend_Config_Ini(APPLICATION_PATH . '\configs\application.ini', 'testing');
        $params = array (   'host'     => $config->resources->db->params->host,
                            'username' => $config->resources->db->params->username,
                            'password' => '',
                            'dbname'   => $config->resources->db->params->dbname
        );
 
 
        $db = Zend_Db::factory('PDO_MYSQL', $params);
        Zend_Registry::set('db', $db);
 
 
 
    }
ce qui est mieux car j 'utilise les infos declatrées dans .ini grâce a
$config = new Zend_Config_Ini(APPLICATION_PATH . '\configs\application.ini', 'testing');
$config->resources->db->params->host
etc.....

en espérant que ca servira a des developpeurs

a++
Séb
dcjones est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 13h38   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 0
Points : 0
c'est encore moi

je crois que j'ai trouvé encore mieux je supprime la méthode
Code :
protected function _initDefaultAdaptater(
) dans le bootstrap.php.

puis j'ai ajoute ceci dans mon .ini
Code :
resources.db.isDefaultTableAdapter = true
et dans le modèle je récupère $db de la manière suivante:
Code :
$db = Zend_Db_Table::getDefaultAdapter();
qu'en pensez vous ?
dcjones est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h41.


 
 
 
 
Partenaires

Hébergement Web