Silex, Assetic et mode debug

Si vous développez un site avec Silex, peut-être utilisez vous Assetic via mheap/Silex-Assetic. Ce provider offre une option de génération automatique des assets : auto_dump_assets. Cette dernière vaut par défaut true, ou false si le mode débug est activé (c’est-à-dire si $app['debug'] vaut true).

Activée, cette options provoquera la génération des assets définis dans l’intégralité de vos templates Twig, et ce à chaque requête. Elle n’est donc utile que dans un cas : avant une mise en production.

On peut être tenté de l’activer le temps du développement, mais dans ce cas chaque réponse se verra énormément retardée par la génération des assets, dont la plupart ne seront pas utilisés. Le workflow idéal consiste plutôt à désactiver explicitement cette option et à ne l’activer qu’une unique fois lorsque tous les assets doivent être générés (typiquement, avant une mise en production).

Cependant, vous aurez besoin de générer les assets définis par les templates que vous testez lors du développement. Plus précisément, il ne faudra générer les assets que des templates chargés lors du traitement de la requête. Comme aucune option n’existe pour cela, il va falloir coder nous-mêmes :

if ($app['debug']) {  
    $app->after(function($request, $response, \Silex\Application $app) {
        /** @var Twig_Environment $twigEnvironment */
        $twigEnvironment = $app['twig'];

        $loadedTemplatesProperty = new ReflectionProperty($twigEnvironment, 'loadedTemplates');
        $loadedTemplatesProperty->setAccessible(true);
        $loadedTemplates = $loadedTemplatesProperty->getValue($twigEnvironment);

        /** @var Twig_LoaderInterface $twigLoader */
        $twigLoader = $app['twig.loader'];

        /** @var \Assetic\Factory\LazyAssetManager $lazyAssetManager */
        $lazyAssetManager = $app['assetic.lazy_asset_manager'];

        if ($loadedTemplates !== null) {
            /** @var Twig_Template $template */
            foreach ($loadedTemplates as $template) {
                $twigTemplateResource = new \Assetic\Extension\Twig\TwigResource(
                    $twigLoader,
                    $template->getTemplateName()
                );
                $lazyAssetManager->addResource($twigTemplateResource, 'twig');
            }

            /** @var $asseticDumper \SilexAssetic\Assetic\Dumper */
            $asseticDumper = $app['assetic.dumper'];

            $asseticDumper->dumpAssets();
        }
    });
}

Ce code fait usage du middleware after, il sera donc exécuté juste avant que la réponse ne soit envoyée au client. Il consiste à récupérer les templates Twig chargés, à les ajouter comme ressources au LazyAssetManager d’Assetic et enfin, à générer les assets de ces templates.
Notez l’utilisation de ReflectionProperty, qui permet de rendre la propriété loadedTemplates de Twig publique afin de récupérer sa valeur.

Et voilà, vous pouvez maintenant développer avec des assets sans ralentissement intempestif !