Web

JSON feed

Autorangel cruz
Publicado
Lectura1 min de lectura

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.

{
	"version": "https://jsonfeed.org/version/1",
	"title": "My Example Feed",
	"homepageurl": "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"
		}
	]
}

Ejemplo rápido con laravel: obtener la lista de post

$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:

$data = [
	'version' => 'https://jsonfeed.org/version/1',
	'title' => 'El nombre de tu feed',
	'homepageurl' => 'https://domain.tld',
	'feed_url' => 'https://domain.tld/feed/json',
	'icon' => 'https://domain.tld/apple-touch-icon.png',
	'favicon' => 'https://domain.tld/apple-touch-icon.png',
	'items' => [],
];

Agregando los items al feed

Este punto es lo más sencillo del mundo, únicamente hay que hacer:

<?php
 
foreach ($posts as $key => $post) {
	$data['items'][$key] = [
		'id' => $post->id,
		'title' => $post->title,
		'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post
		'image' => $post->featured_image,
		'content_html' => $post->content,
		'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),
		'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),
		'author' => [
			'name' => $post->user->name
		],
	];
}

El resultado final

Nuestro método quedaría de esta forma:

<?php
 
class JsonApi
{
	public function jsonFeed()
	{
 
		$posts = Posts::latest();
 
		$data = [
			'version' => 'https://jsonfeed.org/version/1',
			'title' => 'El nombre de tu feed',
			'homepageurl' => 'https://domain.tld',
			'feed_url' => 'https://domain.tld/feed/json',
			'icon' => 'https://domain.tld/apple-touch-icon.png',
			'favicon' => 'https://domain.tld/apple-touch-icon.png',
			'items' => [],
		];
 
		foreach ($posts as $key => $post) {
			$data['items'][$key] = [
				'id' => $post->id,
				'title' => $post->title,
				'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post
				'image' => $post->featured_image,
				'content_html' => $post->content,
				'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),
				'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),
				'author' => [
					'name' => $post->user->name
				],
			];
		}
 
		return $data;
	}
}
Sobre el autor
Angel Cruz

Angel Cruz

Soy desarrollador PHP senior. Casi todo lo que construyo pasa por Laravel, me obsesiona el código que se mantiene y escribo sobre lo que aprendo, con sus trade-offs incluidos.