Automatiser l'usage de LESS via la gestion des environnements de votre framework PHP

LESS est un préprocesseur CSS étendant les possibilités natives du langage, proposant notamment l'utilisation de variables ou encore de mixins (sortes de fonctions) permettant au développeur feignant efficace d'appliquer au CSS le sacro-saint principe du don't repeat yourself. Seulement voilà, qui dit préprocesseur dit compilation, ce qui implique un passage systématique par le terminal. Comment éviter cela ?

Le but du jeu est d'intercepter les appels aux feuilles de styles émis par les navigateurs des visiteurs, et d'y répondre en accord avec l'environnement d'exécution actuel : en développement, on renverra un code non compressé et fraîchement compilé, afin de nous mâcher le travail ; en production en revanche, on créera un fichier CSS minifié et statique à l'occasion de de la première requête, que l'on renverra tel quel lors des suivantes afin d'éviter une charge serveur inutile. Pour changer un peu, nous allons voir comment mettre cela en place avec le framework PHP Symfony2.

Voici tout d'abord comment rerouter les requêtes concernées vers une méthode dédiée d'un contrôleur, dans votre fichier routing.yml :

less_to_css:
pattern: /css/{file}.css
defaults: { _controller: MyBundle:MyController:css }
requirements:
file: ([a-z0-9_-]+)

Ladite méthode embarque le code suivant :

public function cssAction($file)
{
if (! file_exists(CSS_PATH.$file.'.less')) {
throw $this->createNotFoundException('Cette feuille de style est introuvable.');
}

if ($this->container->get('kernel')->getEnvironment() === 'prod') {
if (! file_exists(CSS_PATH.$file.'.css')) {
system('lessc -x '.CSS_PATH.$file.'.less > '.CSS_PATH.$file.'.css');
}
$response = new Response(file_get_contents(CSS_PATH.$file.'.css'));
} else {
$output = array();
exec('lessc '.CSS_PATH.$file.'.less', $output);
$response = new Response(implode(PHP_EOL, $output));
}

$response->headers->set('Content-Type', 'text/css');
return $response;
}

Voilà donc un compromis intéressant entre automatisme et délégation de la compilation au serveur ! Évidemment, ce type de solution ne sera probablement pas adapté à un site à fort trafic, mais aura au moins le mérite de vous libérer l'esprit jusqu'à la fin de la recette.