Laravel : Créer un flux RSS valide

Mis à jour il y a 2 ans

Un tutoriel pour comprendre et créer (mettre en place) un flux RSS dans un projet Laravel

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP
Voir aussi Un tutoriel sur l’utilisation du package rap2hpoutre/fast-excel pour exporter des données d’une collection ou d’un modèle au format Excel xlsx, ods ou csv et d'importer les données d’une feuille de calcul dans un projet Laravel. En savoir plus

Introduction au flux RSS

RSS (sigle provenant de « 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 à jour d’un site web pour présenter les dernières informations consultables.

La capture ci-dessous présente un flux RSS (Celui des publications d’Akili School) lu par le logiciel Mozilla Thunderbird :

Flux RSS des cours d'Akili School sur Mozila Thunderbird

Nous voulons voir dans ce guide comment mettre en place un flux RSS d’une table de la base de données, disons d’un modèle, dans un projet Laravel.

Nous allons commencer par décrire 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") et dans lequel on trouve l’élément <channel> (canal) qui décrit les informations du flux RSS.

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

  • <title> : Le titre du canal (ex : Akili School)
  • <description> : La description du canal (ex : Articles et formations le développement web)
  • <link> : Le lien hypertexte du canal (ex : https://www.akilischool.com/rss/courses.xml)

Nous avons aussi le bloc <item> qui représente une actualité du flux, considérons-le comme 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.

Le <channel> peut être enrichi avec d'autres informations :

  • <language> : La langue dans laquelle le contenu du flux est rédigé (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 de 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 de consulter la documentation du w3c qui décrit plus d'informations.

Mettre en place un flux RSS dans Laravel

Maintenant que nous avons pris connaissance de la structure d'un fichier RSS, mettons en place la route d’accès au flux, le contrôleur pour récupérer les informations du flux et la vue où le présenter.

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 contient les informations minimales requises d'un flux RSS. Dans mon projet, j'ai la table « courses » représentée par le modèle app/Models/Cours.php 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();
        });
    }
    // ...
}

Ce qui donne les colonnes suivantes dans la table « courses » :

  • title : Le titre du cours
  • description : Le description du cours
  • content : Le contenu du cours
  • timestamps() pour created_at et updated_at

La route du flux RSS

Au fichier routes/web.php, insérons 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");

});

Mon choix du préfixe « rss » est pour différencier la route du flux 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 généré, éditons la méthode courses() où nous récupérons les informations du flux (les cours) puis retournons la vue courses.blade.php avec le header « Content-Type : application/xml » (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> du flux RSS puis parcourons données (les cours) en affichant chacun d'eux 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 nous avons terminé de mettre en place le flux RSS, nous pouvons nous assurer de sa validité et savoir si nous avons respecté les spécifications RSS 2 en checkant son URL à l'adresse https://validator.w3.org/feed :

Validation d'un flux RSS sur w3.org

Lire un flux RSS

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.

Il existe une comparaison non exhaustive d'agrégateurs de flux sur Wikipédia que nous vous recommandons de consulter. Pour ma part, j'utilise Mozilla Thunderbird.

Packages Laravel – RSS

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

Portez-vous bien ! 😉

Cette publication vous a plu ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.

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 la plateforme Akili School

Voir profil

Commentaires