Symfony : Une route pour le RSS ?

Publié le 2023-12-27 par DarkChyper

Si vous lisez ce blog, vous savez déjà que j'ai un projet personnel autour de l'option Tempo d'EDF. Ce projet est écrit en PHP avec le framework Symfony, que j'apprécie fortement.

Se remettre dans le tempo


J'ai créé, entre autres, un flux RSS/Atom pour suivre la couleur du lendemain, directement depuis Feeder sur mon Android. J'ai créé un fichier XML à la racine du dossier public, je l'ai référencé dans mon "heade"r afin de le faire découvrir aux navigateurs. Et comme chaque moyen de transmettre l'information Tempo, j'ai créé une page pour indiquer comment l'utiliser.

Sur cette page, j'indique également le lien vers ce flux, lien généré par le système de routing de Symfony évidemment.

J'ai cherché des références sur la manière de générer un flux RSS pour le diffuser sur un site, et la manière assez commune est la suivante :

 PHP

#[Route('/path-to-feed', name: 'feed')] public function feed(): Response // le fichier est généré par un service/script externe // on récupère le contenu du fichier xml $feedContent = file_get_contents('mon-flux.xml'); // on le renvoie comme Response avec le bon header return new Response($feedContent, 200, [ 'Content-Type' => 'application/atom+xml', ]); }

De mon point de vue, cette façon de faire manque d'audace et me semble bien lourde. Demander à php de lire un fichier que le navigateur peut interpréter, c'est dommage au niveau des performances.

D'un autre côté, je ne vois pas mettre un lien en dur directement sur la page, ou utiliser à moitié le système de routing pour générer une URL de base et d'y concaténer le nom du fichier directement dans le twig.

Alors j'ai testé une autre approche :

 PHP

#[Route('/mon-flux.xml', name: 'feed')] public function feed(): void {}

Cette route ne fait rien, et n'est même jamais déclenchée vu que le fichier est directement à la racine du dossier public. Il suffit d'autoriser l'extension ".xml", ou de limiter l'accès à cet unique fichier, dans le ".htaccess" afin de permettre au navigateur de le trouver.


.htaccess ou config de virtualhost Apache2    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule !\.(js|ico|gif|jpg|png|css|xml)$ %{ENV:BASE}/index.php

Alors à votre avis, bonne idée ou mauvaise pratique ?