Dans cette deuxième partie nous allons aborder le déploiement du Zend Framework pour qu'il puisse accueillir nos requêtes en utilisant le format AMF.

 

Il y a deux façon d'utiliser Zend_Amf, soit en standalone, soit en utilisant l'intégralité du framework. C'est ce dernier cas que nous allons aborder. De ce fait, nous pourrons utiliser les classes nécessaire pour la connexion à la base de données, et utiliser les contrôleurs. Le faite de passer par le Framework nous permettra également d'utiliser le bootstrap (fichier de configuration de Zend).

 

Installation

Première chose à faire, bien évidement, il faut récupérer l'archive de la dernière version sur le site.

Nous allons voir ensemble les principaux points pour la configuration du Framework, détaillé dans le quickstart.

 

Voici l'arborescence de Zend :

 

Sans rentrer dans le détail, pour que votre application fonctionne, soit votre site est à la racine et il vous faut définir le DocumentRoot dans /public/ soit définir un VirtualHost (cf quickstart).

 

Configuration

La configuration de notre application passe par le fichier bootstrap.php qui se trouve dans le répertoire /application. Il y a plusieurs manière de configurer, la première consiste à tout insérer dans le fichier bootstrap, l'autre consiste à passer par un plugin. C'est cette dernière méthode que nous allons utiliser. Pour simplifier la migration de l'application sur différents serveurs, il est conseillé d'utiliser un fichier de configuration qui lui ne contiendra que les données nécessaires à la connexion à la base. Ce fichier va se nommer application.ini et se trouvera dans le dossier /application/config.

 

Voici le fichier

[production]
database.adapter            =   "PDO_MYSQL"
database.params.dbname      =   ""
database.params.host        =   "127.0.0.1"
database.params.username    =   ""
database.params.password    =   ""
 
[development : production]
 
[testing : production]

 

Pour épurer le fichier bootstrap, nous allons passer par un plugin qui va s'occuper de tout. Cette classe hérite de Zend_Controller_Plugin_Abstract.

 

Voici tout d'abord le bootstrap :

/**
 * Fichier d'amorcage du framework Zend
 */

// on definie les variables 
define('DEFAULT_PATH', dirname(__FILE__).'/default');
define('ASSETS_PATH', dirname(__FILE__).'/../public/assets');

set_include_path('.' . PATH_SEPARATOR . '../library' . PATH_SEPARATOR . '../application/default/models/' . PATH_SEPARATOR . get_include_path());

require_once 'Initializer.php';
 
// initialisation du front controller. 
$frontController = Zend_Controller_Front::getInstance(); 

// On change le nom de l'environnement (development, production, ...) définie dans application.ini
$frontController->registerPlugin(new Initializer('development'));    

// On envoi la requete via le front controller. 
$frontController->dispatch(); 

 

Attaquons maintenant l'Initializer, en détaillant les principales parties :

La classe va être découpée de sorte à avoir une méthode par type de données à instancier. 

 

La session :

/**
 * Initialize sessions
 */
 public function initSessions() {
	// start session
	Zend_Session::start();
	// -> Vol et fixation, protections
	$defaultNamespace = new Zend_Session_Namespace();
	if (!isset($defaultNamespace->initialized)) {
		Zend_Session::regenerateId();
		$defaultNamespace->initialized = true;
	}
}

 

La base de données :

/**
 * Initialisation des bases de données
 */
public function initDb() {
    $dbAdapter = Zend_Db::factory($this->_config->database);
	Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
}

 

Initialisation des vues :

public function initHelpers() {
   	// register the default action helpers
   	Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
}

 

Initialisation des contrôleurs :

public function initControllers() {
   	$this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
}

 

Et voici le code complet de Initializer.php

require_once 'Zend/Controller/Plugin/Abstract.php';
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Request/Abstract.php';
require_once 'Zend/Controller/Action/HelperBroker.php';
require_once "Zend/Loader.php"; 
require_once "Zend/Config/Ini.php";
require_once "Zend/Session.php";

/**
 * 
 * Initializes configuration depending on the type of environment 
 * (test, development, production, etc.)
 *  
 * This can be used to configure environment variables, databases, 
 * layouts, routers, helpers and more
 *   
 */
class Initializer extends Zend_Controller_Plugin_Abstract
{
    /**
     * @var Zend_Config
     */
    protected static $_config;

    /**
     * @var string Current environment
     */
    protected $_env;

    /**
     * @var Zend_Controller_Front
     */
    protected $_front;

    /**
     * @var string Path to application root
     */
    protected $_root;

    /**
     * Constructor
     *
     * Initialize environment, root path, and configuration.
     * 
     * @param  string $env 
     * @param  string|null $root 
     * @return void
     */
    public function __construct($env, $root = null) {		
        $this->_setEnv($env);
        if (null === $root) 
            $root = realpath(dirname(__FILE__) . '/../');
        
        $this->_root = $root;

        $this->initPhpConfig();
        
        $this->_front = Zend_Controller_Front::getInstance();
        
        $this->_config = new Zend_Config_Ini($this->_root . '/application/config/application.ini', $env);
		
        // set the test environment parameters
        if ($env == 'development') {
            // Enable all errors so we'll know when something goes wrong. 
            error_reporting(E_ALL | E_STRICT);  
            ini_set('display_startup_errors', 1);  
            ini_set('display_errors', 1); 

            $this->_front->throwExceptions(true);  
        }

        // Set up autoload.
        Zend_Loader::registerAutoload(); 
    }

    /**
     * Initialize environment
     * 
     * @param  string $env 
     * @return void
     */
    protected function _setEnv($env) {
        $this->_env = $env;    	
    }
    

    /**
     * Initialize Data bases
     * 
     * @return void
     */
    public function initPhpConfig() {}
    
    /**
     * Route startup
     * 
     * @return void
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request) {
       	$this->initDb();
        $this->initHelpers();
        $this->initView();
        $this->initPlugins();
        $this->initRoutes();
        $this->initControllers();
        $this->initSessions();
    }
	
    /**
     * Initialize sessions
     */
    public function initSessions() {
        // start session
        Zend_Session::start();
        // -> Vol et fixation, protections
        $defaultNamespace = new Zend_Session_Namespace();
        if (!isset($defaultNamespace->initialized)) {
            Zend_Session::regenerateId();
            $defaultNamespace->initialized = true;
        }
    }
    
    /**
     * Initialize data bases
     * 
     * @return void
     */
    public function initDb() {
    	$dbAdapter = Zend_Db::factory($this->_config->database);
        Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
    }

    /**
     * Initialize action helpers
     * 
     * @return void
     */
    public function initHelpers() {
    	// register the default action helpers
        Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
    }
    
    /**
     * Initialize view 
     * 
     * @return void
     */
    public function initView() {
        // Bootstrap layouts
		Zend_Layout::startMvc(array(
		    'layoutPath' => $this->_root .  '/application/default/layouts',
		    'layout' => 'main'
		));
    	
    }
    
    /**
     * Initialize plugins 
     * 
     * @return void
     */
    public function initPlugins() {}
    
    /**
     * Initialize routes
     * 
     * @return void
     */
    public function initRoutes() {}

    /**
     * Initialize Controller paths 
     * 
     * @return void
     */
    public function initControllers() {
    	$this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
    }
}

 

Zend_Amf_Server

Maintenant que notre application est correctement configurée, nous allons pouvoir nous occuper de la partie AMF.

Nous allons donc créer un contrôleur que nous nommerons RemoteController, dont voici le contenu :

/**
 * RemoteController
 */

require_once 'Zend/Controller/Action.php';

class RemoteController extends Zend_Controller_Action {
    public function init(){
        $this->_helper->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender();
    }
	
    public function amfAction() {
        $server = new Zend_Amf_Server();
	// permet la génération d'exception si on rencontre une erreur
        $server->setProduction(false);
        // on définit notre dossier service comme dossier contenant les différents fichiers (ou services) appelés
        $server->addDirectory(DEFAULT_PATH.'/services/');
        // on envoi la réponse du serveur
        $response = $server->handle();
        echo $response;	
    }
}

 

Au niveau de l'arborescence, nous allons créer un dossier service qui contiendra tous nos services appelés par flash. Ensuite, nous auront un dossier dtos qui lui contiendra les différentes données nécessaires à notre application. Nous verrons tout cela un peu plus en détail dans la partie suivante.

 

Pour savoir si tout marche, il vous suffit de tester l'url /remote/amf. Si vous n'avez pas d'erreur c'est que tout est bon, et que nous pouvons maintenant commencer le développement coté Flex.