Tuto : Zend Framework 1.8 et son bootstrap

Voila, on va voir comment fonctionne le Boostrap de la version 1.8 de Zend Framework. Par default le fichier Bootsrap.php est presque vide. Il ne contient que ces quelques lignes :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

}

Mais on va voir ensemble comment construire notre bootstrap

Sommaire

Comment fonctionne le bootstrap ?

Mais a quoi sert le bootstrap ? Le bootstrap, c’est le fichier qui va être lancé au début de l’application et qui va s’occuper d’exécuter toutes les petites routines, de faire les connections aux bases de données, d’instancier toutes les constantes, les sessions, les modules, les layouts etc …

Par défaut le bootstrap fonctionne même si il est vide, mais on peut faire en sorte de le customiser un peu. Comment faire ? Déjà le fichier index.php qui est le premier a être exécuter (dans le dossier public) va lancer la méthode run du bootstrap. On peut alors créer cette méthode. Ensuite  il faut savoir que le bootstrap hérite de Zend_Application_Bootstrap_Bootstrap qui lui est magique (On va y revenir). Donc si on redéfinit la méthode run, il ne faut pas oublier d’appeler la methode run de la class : Zend_Application_Bootstrap_Bootstrap.

    public function run()
    {
        parent::run();
    }

On peut ensuite créer plusieurs méthodes pour par exemple faire les connections aux bases de données, initialiser les sessions etc. Et c’est la que le bootstrap est magique : il suffit de déclarer les méthodes en protected et de mettre un underscrore (_) devant le nom de la méthode, et celle-ci sera directement exécuter.

Si on regarde le code de la méthode run de la class Zend_Application_Bootstrap_Bootstrap, on voit que par défaut on n’utilise pas de module. Il est possible d’utiliser les modules, mais on verra ça plus tard. Donc par défaut il faut respecter l’architecture « normale ».

Mise en place du fichier de configuration.

Comme on a vu dans l’architecture du zend framework, il y a deja un fichier de configuration, mais par défaut il n’est pas vraiment utilisable. Je m’explique : quand on démarre l’application, celle ci utilise bien le fichier de configuration. Mais si a un moment ou a un autre on a besoin de ce fichier, il sera compliqué d’utiliser les constantes définit.
Par défaut le fichier de config ressemble a celui la :

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

Celui ci est basé sur un model orienté objet. Je vous conseil de lire le manuel de Zend si vous êtes un peu perdu : http://zendframework.com/manual/fr/zend.config.adapters.ini.html.

On va donc faire en sorte de pouvoir utiliser ce fichier depuis n’importe ou depuis l’application. On va utiliser la Zend_Registry. C’est quoi Zend_Registry ? C’est un registre (un zone mémoire sur le serveur) ou l’on va pouvoir stocker toutes sorte de choses : constante, pointeurs vers des bases de données etc… On ajoute donc notre fichier de config (qui sont en faites les options (parametres) du bootstrap) à un registre config :

    public function run()
    {
        // Cela permet d'avoir le fichier de configuration disponible depuis n'importe ou dans l'application.
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
        parent::run();
    }

Connexion a la base de données

Pour se faire on va utiliser les données du fichier de configuration : application.ini. On va le convertir en vrai fichier de configuration grâce a Zend_Config, puis on va le donnée a Zend_Db qui va nous faire une factory de notre base de donnée. C’est grâce a cette factory qu’on pourra excécuter des requetes directement sur la base de donnée.

resources.db.adapter = "MYSQLI"
resources.db.params.host = "localhost"
resources.db.params.username = "budget2"
resources.db.params.password = "budget2"
resources.db.params.dbname = "budget2"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true

Pour les variables du fichier de configuration, vous pouvez vous référer au manuel de Zend Framework.

    /**
    * Initialize data bases
    *
    * @return Zend_Db::factory
    */
    protected function _initDb()
    {
    	//on charge notre fichier de configuration
    	$config = new Zend_Config($this->getOptions());
        //On essaye de faire une connection a la base de donnee.
    	try{
             $db = Zend_Db::factory($config->resources->db);
             //on test si la connection se fait
             $db->getConnection();
         }catch ( Exception $e ) {
             exit( $e -> getMessage() );
         }
         // on stock notre dbAdapter dans le registre
         Zend_Registry::set( 'dba', $db );
         return $db;
    }

Enfin on met cette factory dans un registre de manière a pouvoir l’utiliser depuis n’importe ou dans l’application.

Note : On créer ici une connection a la base de donnée qui pourra etre utilisé depuis n’importe quelle partie de l’application. Cependant on verra qu’en regle général, on ne fait pas directement de requete sur la base de donnée, on utilise des models pour se faire

Initialisation des sessions :

On va mettre en place les sessions tout de suite : c’est assez simple. Je pense que le code parle de lui meme.

	/**
     * Initialize session
     *
     * @return Zend_Session_Namespace
     */
    protected function _initSession()
    {
        // On initialise la session
        $session = new Zend_Session_Namespace('budget', true);
        return $session;
    }

Mise en place de modules :

Une bonne partie de la déclaration d’un module par défault va se faire directement dans le fichier de configuration :

#initialize front controller resource
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "Frontend"

Et une autre partie dans le bootstrap :

    /**
    * Initialize Module
    *
    * @return Zend_Application_Module_Autoloader
    */
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APPLICATION_PATH));
        return $loader;
    }

Note : Cependant, si quelqu’un connait bien ZF, j’aimerais avoir une renseignement, car il me semble que le code du bootsrap soit facultatif …

Conclusion :

Voila, on commence a avoir un bon bootstrap qui tient la route, mais on verra par la suite qu’on peut rajouter beaucoup de chose dans ce bootstrap, comme par exemple l’utilisation des layouts …

N’hesitez par a aller faire une tours sur le site de ZF – page application

On retrouve les deux fichiers :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function run()
    {
        // Cela permet d'avoir le fichier de configuration disponible depuis n'importe ou dans l'application.
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
        parent::run();
    }

    /**
    * Initialize Module
    *
    * @return Zend_Application_Module_Autoloader
    */
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => '',
            'basePath'  => APPLICATION_PATH));
        return $loader;
    }

    /**
    * Initialize data bases
    *
    * @return Zend_Db::factory
    */
    protected function _initDb()
    {
    	//on charge notre fichier de configuration
    	$config = new Zend_Config($this->getOptions());
        //On essaye de faire une connection a la base de donnee.
    	try{
             $db = Zend_Db::factory($config->resources->db);
             //on test si la connection se fait
             $db->getConnection();
         }catch ( Exception $e ) {
             exit( $e -> getMessage() );
         }
         // on stock notre dbAdapter dans le registre
         Zend_Registry::set( 'dba', $db );
         return $db;
    }

	/**
     * Initialize session
     *
     * @return Zend_Session_Namespace
     */
    protected function _initSession()
    {
        // On initialise la session
        $session = new Zend_Session_Namespace('budget', true);
        return $session;
    }
}

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

#initialize front controller resource
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction = "index"
resources.frontController.defaultModule = "Frontend"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

#DATABASE
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "budget2"
resources.db.params.password = "budget2"
resources.db.params.dbname = "budget2"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true

Articles en rapport :


Et on peut meme partager l'article:

  • Print
  • Twitter
  • Facebook
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Netvibes
  • Blogosphere News
  • Identi.ca
  • LinkedIn
  • Technorati
  • Wikio FR
  • Yahoo! Buzz
  • Ping.fm

10 Commentaires

Ericjuillet 20th, 2009 at 20 h 22 min

je me demandais quand tu aurais finis d’écrire cette article ? ^^
ou si tu as un lien francophone sur le sujet a faire tourner :)

gregjuillet 20th, 2009 at 21 h 21 min

He bien j’espere qu’il sera en ligne demain dans la journée. Sinon non, j’ai pas trop de liens FR… C’est pour ca que je fais tout ca :p

Ericjuillet 20th, 2009 at 22 h 03 min

bah pour te dire que tu explique très bien les choses, c’est grandement utile pour moi :)
Moi qui ait que peu de notion en OO, et qui ait jamais utilie de framework, ton blog m’aide vraiment pour mon nouveau projet.

gregjuillet 20th, 2009 at 22 h 12 min

Merci Merci, Mais la c’est la MERRRRDE, je suis en train de me faire pirater mon serveur, c’est la merde lol, bon j’essaye de tout fixer …

Ericjuillet 20th, 2009 at 22 h 24 min

bah il a l’air plus rapide qu’il y a une heure :D
bonne chance si sa continue encore ^^

VtZjuillet 22nd, 2009 at 19 h 57 min

Pas mal, on attend la suite du coup :)

Juste une petite proposition – donne une sorte de code complet a la fin pour bien tout récupérer (mieux vos éviter de mettre en début d’article sinon les gens copie/colle direct)

Gregjuillet 22nd, 2009 at 20 h 04 min

Très bien chef, je fais ca !
Sinon merci.

freaknboyaoût 24th, 2009 at 18 h 25 min

Hello,

Moi j’aimerais savoir maintenant, après avoir configurer tout cela, comment récupérer le $db retourné par la méthode _initDb du boostrap, et ainsi faire de l’accès à la base de données dans tous mes controllers,

Merci d’avance,

Freaknboy

Gregaoût 24th, 2009 at 22 h 13 min

c’est tout bete : tu fais :
$dba = Zend_Registry::get( ‘dba’);
mais normalement tu n’a pas (ou peu) besoin de l’utiliser ! j’expliquerai ca dans un prochain tutos, dans un avenir proche …

Gregoctobre 26th, 2009 at 2 h 32 min

Voila comment se connecter et utiliser une base de donnée proprement depuis le Zend Framework :
http://blog.lyrixx.info/zend/comment-gerer-une-base-de-donnee-avec-le-zend-framework/
Lol, oui j’utilise les commentaires pour faire un update …

Laisser un commentaire

Votre commentaire :

Additional comments powered by BackType