Utilisation du composant Assetic de Symfony 2 dans Symfony 1

12/08/11: mise à jour de l'article.

Pour des raisons que je n'évoquerai pas, je continu à développer mes nouveaux projets sur Symfony 1. Mais il est vrai que certains composants de Symfony 2 me font défaut et en particulier Assetic.

Voici donc une élégante (enfin je crois) façon d'intégrer des composants Symfony 2 dans Symfony 1.
Je vais vous montrer comment intégrer et utiliser le composant Assetic de sf2 dans Symfony 1.4 et pour ne pas faire de jaloux dans Symfony 1.0 également.

Pour cette recette nous avons besoin:

  • un projet Symfony 1.x fonctionnel
  • les sources de Symfony 2.0 (j'ai utilisé la RC3 2.0.0)
  • PHP 5.3

La branche Symfony 1 n'est pas censé fonctionner avec PHP 5.3, seul Symfony 2 supporte cette version de PHP. Cela fait plus d'un an que j'utilise PHP 5.3 dans des projets Symfony  1.0 et 1.4 et je n'ai encore pas eu de problème hormis quelques Deprecated qui viennent peupler mes fichiers de logs, je n'ai aucun plantage du framework, il est stable et je peux utiliser les dernières fonctions de PHP.

 

1. Préparation de Symfony 1

Dans Symfony 1, je vais créer un plugins spécifique que je nommerai sf2AsseticPlugin.
Dans ce dossier je vais créer 3 sous dossiers:

  • config: ce dossier contiendra la configuration du plugin
  • external: ce dossier contiendra le jar de yuiCompressor
  • src: ce dossier contiendra les sources Symfony 2

Je n'en ai pas parlé avant, mais j'utilise également l'excellente librairie de Yahoo!: yuiCompressor pour compresser les fichiers javascript et css.
Pour les sources de Symfony 2 il est important de ne pas nommer le dossier 'lib' comme on a l'habitude de faire avec Symfony 1. Le principe de chargement des classes de sf2 étant très différents, merci les namespace, j'utiliserai le Loader de sf2.

 

2. Copie des sources Symfony 2

Depuis sf2 je copie le contenu du dossier src qui se trouve dans /vendor/assetic/src/ dans le dossier src de mon plugin: /plugins/sf2AsseticPlugin/src/ .
J'ai maintenant un dossier Assetic et un fichier functions.php dans le dossier src de mon plugin.

Je vais également avoir besoin d'une brique du Loader de Symfony 2 qui est la classe UniversalClassLoader. Elle se trouve dans /vendor/symfony/src/Symfony/Component/ClassLoader/. Je copie cette classe dans le dossier src de mon plugin.
Pour avoir accès à cette classe depuis Symfony 1.0 en passant outre les namespace, il faut commenter la ligne déclarant le namespace de la classe.

 
//namespace Symfony\Component\ClassLoader;

 

3. Configuration

En théorie tout est pret, il ne reste plus qu'a dire à Symfony 1 comment utiliser les classes de Symfony 2. Pour cela je vais utiliser le fichier de configuration du plugin pour ajouter les classes du composant Assetic via le Loader sf2.

 

a. Symfony 1.0

Dans le dossier config je crée le fichier config.php suivant:

 
<?php
require_once(realpath(dirname(__FILE__).'/../src/UniversalClassLoader.php');
 
$loader = new UniversalClassLoader();
$loader->registerNamespace('Assetic', realpath(dirname(__FILE__).'/../src');
$loader->register();
 

 

b. Symfony 1.4

Dans le dossier config je crée le fichier sf2AsseticPluginConfiguration.class.php suivant:

 
<?php
require_once(__DIR__.'/../src/UniversalClassLoader.php');
 
class sf2AsseticPluginConfiguration extends sfPluginConfiguration
{
 
	public function initialize()
	{
		$loader = new UniversalClassLoader();
		$loader->registerNamespace('Assetic', __DIR__.'/../src');
		$loader->register();
	}
}
 

Je surcharge volontairement la méthode initialize() car c'est la dernière fonction appelée dans le construteur et elle est vide dans la classe parente. Je ne surcharge pas la méthode initializeAutoload() car elle pourrait m'être utile si je décide d'ajouter des classes perso à mon plugin. Il ne faut pas oublier d'activer le plugin dans le fichier /config/ProjectConfiguration.class.php

 

4. Utilisation

Pas besoin d'utiliser le mot clef use pour importer le namespace à utiliser. L'instanciation d'une classe du composant Assetic se fait comme suit dans sf1:

 
$oWriter = new Assetic\AssetWriter(sfConfig::get('sf_web_dir').'/js/');
 
 

Je ferai bientôt un article sur l'utilisation de ce composant.

 

Vous pouvez télecharger les sources complètes là: sf2AsseticPlugin.tgz

Ajouter un commentaire