Laravel : Créer un flux RSS valide

Mis à jour il y a 2 mois

Wilo Ahadi

Auteur

Wilo Ahadi

Technologies

Un guide pour comprendre un flux RSS et le mettre en place dans un projet Laravel

Introduction

RSS (sigle venant de l’anglais « Really Simple Syndication ») est un format de données utilisé pour la syndication de contenu web. C’est à dire simplement que c’est un format qui permet de rendre accessibles certaines informations d’un site web depuis d’autres sites web.

Un flux RSS, aussi appelé « fil d’actualités » ou « fil d’informations », est une ressource dont le contenu est produit automatiquement en fonction des mises à jours d’un site web pour présenter les dernières informations consultables.

La capture ci-dessous illustre un flux RSS (Celui des cours d’Akili School) lu par le logiciel Mozilla Thunderbird :

Flux RSS des cours d'Akili School sur Mozila Thunderbird

Ce guide explique comment mettre en place un flux RSS d’une table d’une base de données, disons d’un modèle, dans un projet Laravel.

Nous allons commencer par étudier la structure d’un fichier de flux RSS avant de le mettre en place puis nous allons créer la route, le contrôleur et la vue nécessaires pour le rendre accessible depuis une URL.

Structure d’un fichier RSS

Un flux RSS est un fichier au format XML dont le squelette avec les informations minimales requises se présente de la manière suivante :

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>Mon site</title>
        <description>Ceci est la description de mon site</description>
        <link>http://www.example.com</link>
        <item>
            <title>Actualité 1</title>
            <description>Ceci est ma première actualité</description>
            <link>http://www.exemple.com/news-1</link>
        </item>
        <item>
            <title>Actualité 2</title>
            <description>Ceci est ma seconde actualité</description>
            <link>http://www.exemple.com/news-2</link>
        </item>
    </channel>
</rss>

Nous avons à la première ligne la déclaration XML qui indique la version XML du document (version="1.0") et l’encodage des caractères (encoding="UTF-8").

Ensuite vient l’élément <rss> qui indique la version RSS du document (version="2.0") dans lequel on trouve l’élément <channel> (canal) qui décrit les informations du flux RSS.

L'unique élément <channel> contient les informations suivantes :

  • <title> : Le titre du canal (ex : Akili School)
  • <description> : La description du canal (ex : Cours sur les métiers du numérique)
  • <link> : Le lien hypertexte du canal (ex : https://www.akilischool.com/rss/courses.xml)

Le <channel> peut être enrichi avec les informations suivantes :

  • <language> : La langue dans laquelle le contenu du flux est redigé (Ex : fr, en, fr-fr, ...). Voir la liste des valeurs autorisées.
  • <lastBuildDate> : La dernière date de mise à jour du contenu du canal suivant le standard RFC-822 date-time (Ex : Sat, 07 Sep 2020 00:00:01 GMT)
  • <webMaster> : L'adresse email de la personne à contacter en cas des problèmes techniques
  • <category> : Une ou plusieurs catégories relatives au canal
  • ...

Pour en savoir plus sur les spécifications RSS 2, nous vous recommandons la documentation du w3c qui décrit plus d'informations.

Vient ensuite le bloc <item> qui représente une actualité du flux, prenons-le pour un lien vers un contenu du site web. Tous les éléments d'un bloc <item> sont optionnels mais il faut au moins y inclure :

  • <title> : Le titre de l'item
  • <description> : La description de l'item
  • <link> : Le lien de l'item
  • <pubDate> : La date de publication de l'item
  • ...

Les blocs <item> peuvent être enrichis avec l'adresse email de l'auteur <author>, la catégorie <category>, la source <source> ... voir les spécifications RSS 2.

Mise en place d’un flux RSS dans Laravel

Maintenant que nous avons la structure du fichier RSS, mettons en place la route d’accès au flux, le contrôleur pour récupérer les informations et la vue où les afficher. Nous allons travailler avec les 3 fichiers suivants :

  • routes\web.php
  • App\Http\Controllers\RssController.php
  • resources\views\rss\courses.blade.php

Pour les données, nous avons besoin d’une table dans la base de données qui présente les informations minimales requises d'un flux RSS. Dans mon projet, j'ai la table « courses » représentée par le modèle « Cours » dont la migration database\migrations\..._create_courses_table.php se présente de la manière  suivante :

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCoursesTable extends Migration
{
	
    public function up()
    {
        Schema::create('courses', function (Blueprint $table) {
            $table->id();
            $table->string("title");
            $table->string('description');
            $table->text('content');
            $table->timestamps();
        });
    }

    // ...
}

La route du flux RSS

Au fichier routes\web.php, ajoutons la route qui va permettre d’accéder au fil d’informations des cours « courses » :

# La route du flux RSS avec "rss" en préfixe
Route::group([ 'prefix' => 'rss' ], function () {

	// L'URL "exemple.com/rss/courses"
	Route::get("courses", "RssController@courses");

});

J’utilise le préfixe « rss » pour la route du flux question de la différencier avec les autres URLs. Nous pouvons aussi ajouter à l'URL l’extension « .xml » ou « .rss » pour avoir « …/courses.xml » ou « …/courses.rss »

Le contrôleur du flux RSS

Générons le contrôleur qui va se charger de récupérer les informations du flux et retourner la réponse avec le header spécifique pour du contenu XML :

php artisan make:controller RssController

Au fichier App\Http\Controllers\RssController.php que nous obtenons, complétons la méthode courses() en récupérant les données puis en retournant la réponse avec la vue « courses.blade.php » et le header « Content-Type : application/xml » (Un flux RSS est un fichier XML) : 

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Cours;

class RssController extends Controller
{
    // Le flux RSS des cours
    public function courses () {

    	// On récupère les cours
    	$courses = Cours::select('id', 'title', 'description', 'created_at')
    				->latest()
    				->get();

    	// La réponse avec la vue et le header spécifique
    	return response()
    			->view("rss.courses", compact("courses"))
    			->header('Content-Type', 'application/xml');
    }
}

La vue du flux RSS

Pour la vue resources\views\rss\courses.blade.php, complétons les informations du canal <channel> puis parcourons données (les cours) en les affichant chacun dans un <item> :

@php echo '<?xml version="1.0" encoding="UTF-8"?>' @endphp
<rss version="2.0">
    <channel>
        <title>{{ config('app.name') }}</title>
        <description>Description de mon flux RSS ici</description>
        <lastBuildDate>{{ $courses->first()->created_at->toRfc7231String() }}</lastBuildDate>
        <link>{{ config('app.url') }}</link>
        @foreach ($courses as $course)
        <item>
            <title>{{ $course->title }}</title>
            <description>{{ $course->description }}</description>
            <pubDate>{{ $course->created_at->toRfc7231String() }}</pubDate>
            <link>{{ route('cours.show', $course) }}</link>
        </item>
        @endforeach
    </channel>
</rss>

Maintenant que le flux RSS est prêt, nous pouvons nous assurer de sa validité et savoir si nous avons respecté les spécifications RSS 2 en le checkant à l'adresse https://validator.w3.org/feed :

Validation d'un flux RSS sur w3.org

Pour lire un flux RSS, on utilise un logiciel agrégateur c’est-à-dire un logiciel qui traite plusieurs flux en même temps, prévient les mises à jour d'un site web et importe le nouveau contenu. Vous pouvez trouver une comparaison non exhaustive d'agrégateurs de flux sur Wikipédia. Pour ma part, j'utilise Mozilla Thunderbird.

Packages Laravel – RSS

Pour vous inspirer et voir d'autres approches, nous vous proposons quelques packages qu’on trouve sur GitHub qui traitent avec le flux RSS :

Wilo Ahadi
Wilo Ahadi, l'auteur

Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, Infographiste et designer, ... J'aime partager mon expérience en formant sur Akili School

Voir mon profil Suivre