Laravel 12.45 lanzó una nueva actualización que trae como novedad principal el agregado de JsonApiResource, una nueva manera de crear las respuestas de API siguiendo el estándar JSON:API. Esta mejora apunta a ordenar y unificar la estructura de las respuestas, algo que es muy útil en proyectos donde la API creció mucho y se transforma lentamente en un desastre para mantener.

La diferencia clave con los recursos tradicionales de Laravel es la estructura del JSON. Mientras que los Eloquent API Resources devuelven los campos directamente, JsonApiResource organiza los datos dentro de la clave attributes y agrega id y type como campos de primer nivel. Esto alinea automáticamente las respuestas con la especificación JSON:API, que define una estructura clara basada en type, id, attributes y relationships.

Ejemplo usando JsonApiResource en Laravel 12.45

Supongamos que tenemos el típico modelo de Post. Con un Resource tradicional, algo así:

<?php

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'content' => $this->content,
        ];
    }
}

La respuesta que nos trae JsonResource es:

{
  "id": 1,
  "title": "Mi post",
  "content": "Contenido del post"
}

Si empezamos a utilizar JsonApiResource en Laravel 12, nos quedaría formateado según las especificaciones de JSON:API:

<?php

use Illuminate\Http\Resources\Json\JsonApiResource;

class PostResource extends JsonApiResource
{
    public function toAttributes($request)
    {
        return [
            'title' => $this->title,
            'content' => $this->content,
        ];
    }
}

Respuesta en JsonApiResource:

{
  "data": {
    "type": "posts",
    "id": "1",
    "attributes": {
      "title": "Mi post",
      "content": "Contenido del post"
    }
  }
}

Otro punto importante es que este nuevo recurso se puede configurar de forma global desde un Service Provider, como AppServiceProvider. A través del método configure, es posible agregar más datos comunes a todas las respuestas.

Usando Variables Comunes en todos los Json

Tal como te comenté, podes agregar campos que consideres que tienen que estar en todas tus respuestas, como puede ser: la fecha, la hora, la versión, la ip, etc… Solamente hay que configurar el Service Provider:

use Illuminate\Http\Resources\Json\JsonApiResource;

public function boot(): void
{
    JsonApiResource::configure()
        ->withMeta([
            'api' => [
                'version' => '1.1',
            ],
        ]);
}

Además de JsonApiResource, la actualización viene con varias mejoras internas y nuevas funcionalidades: se agregaron eventos para pausar y reanudar colas, mejoras en seguridad como el cambio en la forma de almacenar la cookie “remember me”, soporte ampliado para enums en sesiones y caché, nuevos métodos en el query builder, mejoras en mensajes de error de base de datos y varios refactors y correcciones que apuntan a mayor estabilidad y claridad en el framework.

Copyright © 2018-2020 Latirus. Todos los Derechos Reservados.