Article mis à jour le : 05-05-2022
Comment gérer les fichiers publics (css, js, images) de vos bundles Symfony 2Sous Symfony 2 le découpage en bundles permet de rendre ceux-ci réutillisables et exportables facilement, grâce à un découpage clair (arborescence des répertoires) mais surtout au fait que tout les fichiers du bundle sont compris à l'intérieur de celui-ci, y compris les fichiers "publics", à savoir les feuilles de styles, les images, les scripts JavaScript...
Seulement la question qui revient souvent est de savoir comment utiliser ces fichiers. En effet, prenons l'exemple d'une feuille de style (fichier css), de notre bundle Toto. Elle se trouve donc dans :
Toto/Resources/public/css
Ainsi, si vous mettez dans votre layout (gabarit) ce code, cela ne marchera pas :
<link href="/bundles/toto/css/monStyle.css" rel="stylesheet" type="text/css" media="all" />
Et pour cause! Le serveur ne permet l'accès qu'aux fichiers se trouvant dans le répertoire web. Tous les fichiers accessibles au public s'y trouvent donc. Vous remarquerez dedans qu'il existe par défaut dans ce dossier un répertoire nommé "bundles" avec à l'intérieur les noms des bundles présent par défaut dans Symfony 2, comme le bundle acmedemo. Et à l'intérieur... ses fichiers publics parfaitement accessibles.
Vous pourriez vous dire "Mais quel est l'intérêt de devoir dupliquer ces fichiers ?". La réponse est aucun. En fait il existe une astuce. Cela dépend des versions de Symfony 2, mais avec la 2.6, vous pouvez tapez cette commande dans la console :
$ php app/console assets:install --symlink
Cette commande permet de copier automatiquement les fichiers publics de TOUT les bundles de votre Symfony 2 dans les répertoires correspondant du dossier web/bundles/.
A ceci près... Car la dernière partie de la commande "-- symlink" est optionnelle. En effet, si vous ne la mettez pas c'est ce qu'il va se passer. Mais si vous la mettez, Symfony va tenter de créer un lien symbolique pour les bundles vers le répertoire public de chaque bundle. Ainsi web/bundles/toto pointera vers toto/Resources/public/ permettant ainsi de ne plus avoir à retaper cette commande (à part si vous ajouter d'autres bundles bien entendu).
Cependant, ce système de lien symbolique n'est pas pris en charge par certains systèmes d'exploitation, donc il vous faudra peut-être retaper cette commande à chaque modification de fichiers publics de votre bundle.