Billet très bref et concis sur un problème auquel j’ai été confronté lors de la migration de ce blog vers symfony. D’ailleurs, à ce jour, aucune date de sortie précise n’est encore prévue étant donné mes disponibilités assez aléatoires et limitées ces temps-ci. Mais revenons à ce fameux problème.
Afin d’optimiser au mieux mon application, maitre mot de la nouvelle release, j’ai souhaité passer mes fichiers CSS, scripts Javascripts et autres images sur différents sous-domaines (vous pourrez retrouver de nombreux articles sur le blog de Thomas Parisot concernant l’optimisation, en plus, c’est un bordelais éhéh!), sans avoir à modifier le core de symfony. Je suis bien trop feignant pour avoir une installation de symfony par répertoire et modifier le fichier AssetHelper.php (celui qui définit les fonctions use_javascript(), image_tag() et use_stylesheet()) exploserait complètement mes projets liés à cette installation d’où l’importance de ne pas y toucher. L’autre problématique concerne l’organisation des helpers en soit puisque ces trois fonctions ne sont pas définies dans une classe et impossible, à ma connaissance, à surcharger donc. Pourtant, c’est un peu le principe que j’ai utilisé pour arriver à mes fins.
Pré-requis
Pour cette exemple, j’utiliserai les répertoires par défaut de symfony ainsi que les sous-domaines suivants:
Je n’expliquerai pas comment les rendre accessibles puisqu’il suffit simplement de les faire pointer sur les répertoires par défaut.
Création du helper personnalisé
Dans un premier temps, nous allons créer nos helpers qui vont tout simplement venir « surcharger » ceux qui existent déjà dans le but de limiter au maximum le nombre de lignes et de ne pas perturber le bon fonctionnement du reste. Nous procédons à la création du fichier « customHelper.php » dans le répertoire ./lib/helpers/ puisque j’envisage éventuellement de le réutiliser dans mon backend (à voir par la suite…). Nous ajoutons donc notre code comme suit (notez la grande nouveauté de la soirée, j’ai enfin installé un syntax highlighter !!) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | < ?php function custom_image_tag($img, $params = array()) { if (!$img{strlen($img) - 4} != '.') { $img .= '.png'; } return image_tag(sfConfig::get('app_custom_img_dir', 'http://images.blog/') . $img, $params); } function custom_use_javascript($js, $position = '', $options = array()) { return use_javascript(sfConfig::get('app_custom_js_dir', 'http://js.blog/') . $js, $position, $options); } function custom_use_stylesheet($css, $position = '', $options = array()) { if (!$css{strlen($css) - 4} != '.') { $css .= '.css'; } return use_stylesheet(sfConfig::get('app_custom_css_dir', 'http://css.blog/') . $css, $position = '', $options = array()); } |
Aucun commentaire, le code est simplissime… Petite limitation pour les fichiers CSS et images qui n’ont pas nécessairement d’extension et qui, malgré le fait qu’elle soit ajoutée automatiquement (.css pour les fichiers CSS et .png pour les fichiers images) n’est pas retournée correctement ce qui pose problème lors de l’appel vers le serveur. Les javascripts sont pourtant bien chargés…
Dans notre exemple, j’ai volontairement utilisé des appels à sfConfig() uniquement pour me simplifier la migration vers le serveur de production par la suite mais, comme vous pouvez vous en douter, je ne l’ai pas défini, d’où l’url par défaut !
Enfin, n’oubliez pas de modifier éventuellement vos feuilles de styles si elles font appel à des images.
Utilisation
Avant même d’aligner une ligne de code, on rajoute immédiatement « custom » à notre ligne « standard_helper » de notre fichier ./apps/frontend/config/settings.yml suivi d’un bon vieux symfony cc. La syntaxe reste donc parfaitement identique à celle existante hormis le fait qu’il faille préfixer le nom des fonctions par « custom_ ». Exemple: custom_image_tag() à la place de image_tag(). Pour modifier les adresses des sous domaines, n’oubliez pas de rajouter les lignes suivantes dans votre fichier ./apps/frontend/config/app.yml:
custom_css_dir: http://css.exemple.com/
custom_js_dir: http://js.exemple.com/
custom_img_dir: http://img.exemple.com/
Bonne nuit journée!













Je pense que le plugin sfDynamicsPlugin devrait te plaire. Il ne propose pas l’utilisation de sous-domaines mais change toute la gestion des fichiers CSS et JS dans un projet.