Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour, je suis confronté à quelques problèmes pratiques lors de mon utilisation de Zend.
Je voudrais pouvoir utiliser Zend_DB un peu partout dans mon projet. J'entends par la que ayant déclaré sur mon index.php:
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);
Je m'attendais à pouvoir utiliser $db sur toutes les pages du site mais je n'y arrive pas. J'entends par la que je pensais que j'aurais pu appeller $db à ma guise nimporte où dans mon code mais cela ne fonctionne pas. Et particulièrement pour un appel de $db dans un controlleur, où j'obtiens 'Notice: Undefined variable: db'. C'est à ne rien y comprendre. Ce n'est pas une erreur de syntaxe car la variable porte bien le bon nom.
Dans la même veine j'exécute du javascript asynchrone qui va rechercher des informations sur une base de données. C'est informations sont pourvues au moyen d'une page qui va chercher les instructions, mais à cette page je voudrais utiliser $db, n'est ce vraiment pas possible ? parce que pour le moment j'en suis réduit à utiliser mysql_connect.
Merci d'avance pour vos réponses et suggestions.
Hors ligne
Il faut que tu enregistre ton adapter en Registry dans l'index, tu pourra ensuite l'utiliser dans tes controllers. Va voir dans le tuto d'introduction et fait pareil : ça marche très bien de mon coté
Hors ligne
idem que haltabush. Sinon le Zend_Db_Table::setDefaultAdapter($db); sert à indiquer que si tu utilises des objets qui héritent de Zend_Db_Table, pour eux et uniquement pour eux, ils vont utiliser ta connexion $db de façon transpartente.
A+, Philippe
Hors ligne
J'ai bien fait :
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);
Est ce de cela que vous parlez ? ou bien faut il que je cherche une méthode $registry->set($db) ??? :s
Peut etre est ce que je ne sait pas comment utiliser $db... je suis désespéré
Hors ligne
Non, ce n'est pas la config que tu dois stocker mais l'adapter.
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray()); Zend_Db_Table::setDefaultAdapter($db); $registry = Zend_Registry::getInstance(); $registry->set('adapter', $db);
et quand tu veux t'en servir qq part, tu le récupère
$db = $registry->get('adapter');
Hors ligne
J'ai éssayé ca, ca ne marche pas. J'ai éssayé daccéder à $registry depuis le controleur et depuis une vue ca ne passe pas. :s
Hors ligne
bah depuis le controller, $registry il faut le récupérer aussi c'est un singleton, donc meme procédure qu'au début, et tu récupère la meme instance.
donc dans le controller, ou depuis n'importe où :
$registry = Zend_Registry::getInstance();
Hors ligne
Re... Il m'a suffit de faire : $db = Zend_Registry::get('adapter'); pour récuperer $db. Je ne suis pas très calé concernat l'utilisation judicieuse des méthodes. Mais voila ca marche. Merci quand même.:d
Hors ligne
C'est une autre facon de faire. Comme au dessus, tu recupérais une instance dans une var local, j'ai fais pareil, mais tu peux effectivement utiliser les appel static. Les 2 fonctionnent
Hors ligne
Sinon en ce qui concerne l'utilisation de db pour des pages qui ne passent pas par index.php comment puis je faire ? Typiquement les pages ajax qui discutent avec le serveur de BDD
Hors ligne
Bah de la meme facon. L'accès a la BDD n'a rien a voir avec le MVC.
try { $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray()); $db->getConnection(); // A faire uniquement si tu as des object qui dérive Zend_Db_Table_Abstract, sinon, c'est inutile. Zend_Db_Table::setDefaultAdapter($db); // Si ton code ajax est une class et que tu veux accéder à $db tu peux toujours le mettre en registry Zend_Registry::set('adapter', $db); } catch (Zend_Db_Adapter_Exception $e) { echo 'Zend_Db: Adapteur exeption ' . $e->getMessage(); } catch(Zend_Exception $e) { echo 'Zend_Db: Factory exeption' . $e->getMessage(); } ... // et tu le récupère comme d'hab $db = Zend_Registry::get('adapter');
Dernière modification par TiTerm (18-07-2007 22:24:10)
Hors ligne
Chez moi, les requêtes ajax passent par index.php. J'ai un controlleur particulier qui gère toutes mes requêtes ajax et les convertit dans le format adéquat.
Philippe
Hors ligne
TiTerm a écrit:
.... L'accès a la BDD n'a rien a voir avec le MVC.....
Là, je dois avouer que j'accroche un peu. Mon niveau en POO n'a rien de pharamineux, mais selon le Design Pattern MVC, corrigez-moi si je fais erreur, cette assertion est fausse : le Contrôleur traite et prépare les données, données affichées par la Vue mais récupérées par le Modèle. L'accès aux données rentre parfaitement dans le design Pattern dans la partie Modèle. C'est du reste bien là qu'on met les dataObjects de l'ORM pour les tables du schéma utilisé. Non ? Alors je dois bien constater qu'avec le ZF on peut très bien avoir un répertoire modèle vide et l'architecture du framework prend parfaitement en charge l'accès aux données en court-circuitant cette partie, mais est-ce que ce n'est pas là qu'on devrait trouver les extensions maison pour les accès moins standards ?
Hors ligne
Certes dans un MVC, on a un accès aux données localisé dans le modèle.
Par contre, on peut tout à fait accéder à des données en base sans utiliser de MVC. Rien n'empêche d'utiliser directement Zend_Db dans un script isolé (un script en ligne de commande par exemple ou une page d'admin quelconque...). Je pense que c'était le sens de la remarque de TiTerm.
A+, Philippe
Hors ligne
Cyrano, je n'ai peut etre pas été claire dans ma réponse mais je répondais à la remarque précédente uniquement. Sortie de son contexte, il est évident que ca prete à confusion.
La question reformulée comme je l'ai compris était :
"comment faire pour accéder a la BDD quand on ne passe pas par l'index.php (le front Controller), par exemple dans le cas Ajax ?".
D'ou ma réponse: On n'a pas besoin d'un MVC pour accéder a la BDD.
Mais je n'ai pas dit que l'accès BDD n'était pas décrit dans le pattern MVC.
Pour rebondir sur ce que dit philipe, j'ai effectué un choix similaire et j'ai un un helper dédié à l'AJAX et donc mes accès BDD sont gérés par le Modèle
Hors ligne
Ça me rassure, au moins j'ai pas dit une connerie
Hors ligne
Pages: 1