JSON Feed è un nuovo standard utile a dare forma a un feed RSS basato su JSON che mira a semplificare la creazione dei feed abbandonando lo standard XML. Implementare un feed nel tuo sito è semplice, e la sintassi è sorprendentemente chiara.

Ecco un esempio:

{
    "version": "https://jsonfeed.org/version/1",
    "title": "My Example Feed",
    "home_page_url": "https://example.org/",
    "feed_url": "https://example.org/feed.json",
    "items": [
        {
            "id": "2",
            "content_text": "This is a second item.",
            "url": "https://example.org/second-item"
        },
        {
            "id": "1",
            "content_html": "<p>Hello, world!</p>",
            "url": "https://example.org/initial-post"
        }
    ]
}

vediamo come creare un feed come questo con un breve esempio.

Prendi un elenco di post

Il primo passo è prendere un elenco di record dal database. In questo sito i record si trovano nella tabella “Posts” e usando Eloquent prendiamo gli ultimi 20 per il feed.

$posts = Post::limit(20)->get();

Setup dei dati per il JSON feed

Le specifiche del JSON Feed prevedono alcuni campi opzionali come ad esempio il titolo, URL del feed, icona del sito, e altri. Visto che non sono dati dinamici li aggiungiamo in un array manualmente:

$data = [
    'version' => 'https://jsonfeed.org/version/1',
    'title' => 'Laravel News Feed',
    'home_page_url' => 'https://laravel-news.com/',
    'feed_url' => 'https://laravel-news.com/feed/json',
    'icon' => 'https://laravel-news.com/apple-touch-icon.png',
    'favicon' => 'https://laravel-news.com/apple-touch-icon.png',
    'items' => [],
];

Il campo vuoto items conterrà tutti i nostri post.

Aggiungiamo gli elementi al JSON Feed

Il passo finale è quello di effettuare un ciclo di tutti i nostri $posts e aggiungerli all’array items. Ecco un esempio utilizzando i miei dati:

foreach ($posts as $key => $post) {
    $data['items'][$key] = [
        'id' => $post->id,
        'title' => $post->title,
        'url' => 'https://laravel-news.com/'.$post->uri,
        'image' => $post->featured_image,
        'content_html' => $post->parsed_content,
        'date_published' => $post->created_at->tz('UTC')->toRfc3339String(),
        'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
        'author' => [
            'name' => $post->user->name
        ],
    ];
}

L’unica parte univoca sono i time stamps. Utilizziamo le funzionalità di Carbon per convertire a UTC e al formato RFC 3339 richiesto dalle specifiche JSON.

Risultato finale

Ecco il metodo completo finale:

public function json()
{
    $posts = Post::active()->limit(20)->get();

    $data = [
        'version' => 'https://jsonfeed.org/version/1',
        'title' => 'Laravel News Feed',
        'home_page_url' => 'https://laravel-news.com/',
        'feed_url' => 'https://laravel-news.com/feed/json',
        'icon' => 'https://laravel-news.com/apple-touch-icon.png',
        'favicon' => 'https://laravel-news.com/apple-touch-icon.png',
        'items' => [],
    ];

    foreach ($posts as $key => $post) {
        $data['items'][$key] = [
            'id' => $post->id,
            'title' => $post->title,
            'url' => 'https://laravel-news.com/'.$post->uri,
            'image' => $post->featured_image,
            'content_html' => $post->parsed_content,
            'date_created' => $post->publishes_at->tz('UTC')->toRfc3339String(),
            'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
            'author' => [
                'name' => $post->user->name
            ],
        ];
    }
    return $data;
}

Una cosa da notare è che con Laravel non dobbiamo impostare alcun header particolare o cose del genere, dobbiamo soltanto restituire l’array $data che verrà convertito automaticamente in formato JSON con i corretti header.

Se vuoi implementare un package per questo proposito o hai bisogno di qualche funzionalità avanzata dai un’occhiata al nuovo LaravelJsonFeed di Mateus Guimarães.   

LaraMind è il punto di riferimento in Italia per quanto riguarda Laravel e Vue.js, dai un’occhiata ai corsi a catalogo e a tutte le soluzioni formative custom per privati e aziende!

Fonte Laravel News