La estructura de un feed
Un feed JSON comienza con alguna información en la parte superior: dice de dónde proviene el feed, y puede decir quién lo creó, etc. Después de eso, hay una serie de objetos, elementos, que describen cada objeto en la lista.
1{ 2 "version": "https://jsonfeed.org/version/1", 3 "title": "My Example Feed", 4 "homepageurl": "https://example.org/", 5 "feed_url": "https://example.org/feed.json", 6 "items": [ 7 { 8 "id": "2", 9 "content_text": "This is a second item.",10 "url": "https://example.org/second-item"11 },12 {13 "id": "1",14 "content_html": "<p>Hello, world!</p>",15 "url": "https://example.org/initial-post"16 }17 ]18}
Ejemplo rápido con laravel: obtener la lista de post
1$posts = Posts::latest();
Configura los datos básicos para el JSON Feed
La especificación de JSON Feed tiene algunos campos de nivel superior opcionales, como título, URL de fuente, ícono de sitio y más. Estos campos no son dinámicos por lo que hay que agregarlos a un arreglo de forma manual:
1$data = [2 'version' => 'https://jsonfeed.org/version/1',3 'title' => 'El nombre de tu feed',4 'homepageurl' => 'https://domain.tld',5 'feed_url' => 'https://domain.tld/feed/json',6 'icon' => 'https://domain.tld/apple-touch-icon.png',7 'favicon' => 'https://domain.tld/apple-touch-icon.png',8 'items' => [],9];
Agregando los items al feed
Este punto es lo más sencillo del mundo, únicamente hay que hacer:
1<?php 2 3foreach ($posts as $key => $post) { 4 $data['items'][$key] = [ 5 'id' => $post->id, 6 'title' => $post->title, 7 'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post 8 'image' => $post->featured_image, 9 'content_html' => $post->content,10 'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),11 'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),12 'author' => [13 'name' => $post->user->name14 ],15 ];16}
El resultado final
Nuestro método quedaría de esta forma:
1<?php 2 3class JsonApi 4{ 5 public function jsonFeed() 6 { 7 8 $posts = Posts::latest(); 9 10 $data = [11 'version' => 'https://jsonfeed.org/version/1',12 'title' => 'El nombre de tu feed',13 'homepageurl' => 'https://domain.tld',14 'feed_url' => 'https://domain.tld/feed/json',15 'icon' => 'https://domain.tld/apple-touch-icon.png',16 'favicon' => 'https://domain.tld/apple-touch-icon.png',17 'items' => [],18 ];19 20 foreach ($posts as $key => $post) {21 $data['items'][$key] = [22 'id' => $post->id,23 'title' => $post->title,24 'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post25 'image' => $post->featured_image,26 'content_html' => $post->content,27 'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),28 'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),29 'author' => [30 'name' => $post->user->name31 ],32 ];33 }34 35 return $data;36 }37}