03sept. 2008

Déplacer les répertoires d'une application Symfony

L'idée est d'utiliser le framework pour l'adapter à des plateformes contraignante.

Vous devez vous adapter au monde et vous devez en tant que développeur vous adapter à la plateforme sur laquelle tourne votre application.

Voici quelques astuces pour se faciliter la vie.

Où c'est qu'elles sont mes affaires ?

Tout d'abord il faut savoir que sous Symfony 1.1, le point d'entrée du programme est votre contrôleur situé dans le WebDir (/web).

Ce contrôleur fait référence à une classe qui s'appelle "ProjectConfiguration". Cette classe se trouve dans le répertoire config à la racine du projet symfony.

Ladite classe est chargée avec une méthode native PHP, c'est le tout début du traitement de la requête. C'est elle qui va initialiser les librairies de Symfony et votre application.

Il est donc impossible d'initialiser l'application si le contrôleur ne sais pas où se trouve le fichier contenant la classe. Par défaut, il le cherche dans le dossier config situé au niveau inférieur.

Extrait du fichier index.php :

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

Dans le cas où le webdir ne se trouve pas à son emplacement par défaut, il vous faut modifier le contrôleur.

A moins de copier le contenu du fichier dans le contrôleur lui même (ce qui n'est pas recommandé), il n'est à mon sens pas possible de définir dynamiquement l'emplacement du WebDir dans une application.

La méthode setWebDir permet de contrer les régressions des répertoires web fantaisistes. Elle ne permet pas de définir un nouveau WebDir.

Déplacer le cache et le répertoire de log

Ici les choses sont beaucoup plus simple. Les méthodes setLogDir setCacheDir de la classe sfApplicationConfiguration permettent de donner un chemin absolu vers n'importe quel répertoire du système.

Ces méthodes peuvent être appelé dans :

  • La méthode setup de la classe de configuration de votre application situé dans le répertoire config de votre application.
  • La méthode setup de la classe de configuration du project situé dans le répertoire config à la racine du projet.

Pourvu que le serveur ait les droits d'écriture sur le répertoire, tout ira bien.

Aller plus loin, toujours plus loin

Déplacer les répertoires c'est bien. Éditer un classe quand on change de serveur, c'est mal. C'est moche, pas classe etc ... .

Symfony utilise un puissant système de fichiers de configuration. Il met également à notre disposition la librairie sfYaml qui permet d'ouvrir et de lire des fichiers yaml.

Plaçons donc les emplacements des répertoires dans un fichier de configuration starterconfig.yml.

Les classes de configuration permettent d'appeler des méthodes du framework au début du traitement d'une requête.

Mais les méthodes setup et particulièrement la méthode setup de ProjectConfiguration ne fournissent peu d'élements du framework Symfony.

La classe ProjectConfiguration ne permet pas (à vérifier) d'appeler la librairie sfYaml ; celle ci n'est pas chargée.

On utilisera la méthode setup de la classe de configuration qui elle dispose de cette librairie.

Voici un exemple de code :

public function setup()
{
    $config=sfYaml::load(sfConfig::get('sf_app_config_dir') . '/startconfig.yml');
    $env=$this->getEnvironment();

    if(array_key_exists($env, $config) && isset($config[$env])

       && is_array($config[$env])) {

       $this->setCacheDir($configEnv['mycustomecachedir'];

       $this->setLogDir($configEnv['mycustomlogdir'];

    }

}

Ce code change les répertoires de log et de cache en fonction de l'environnement du contrôleur. Il ne regarde pas si des valeurs sont défini dans l'environnement all.

Source : ici.