Transformar fácilmente en PHP datos sin procesar en objetos

Valinor.jpg
Solucionex
05
Ene 23

Transformar Datos como JSON o Arrays a Objetos y validar su correcta estructura siempre nos ha supuesto un trabajo bastante tedioso.No obstante, hace poco, tuvimos la suerte de descubrir la librería Valinor que nos permite transformar de una manera muy sencilla éste tipos de datos a objetos. Con la salida de la versión 1.0 (ahora mismo va por la versión 1.1) nos hemos animado a dedicarle un pequeño post explicando su funcionamiento.

Introducción

Valinor nos facilita la transformación de raw inputs (JSON, Arrays, etc.) en Objetos, ocupándose de la construcción y validación de estos datos, asegurando un formato totalmente válido. Si en algún momento se detectase un error en la estructura de datos, Valinor se encargaría en devolvernos un error fácilmente legible. Al devolverlo como Objeto, nos devolverá cada dato con su tipado; es decir, si la estructura tiene un campo como, por ejemplo, id: 1 podremos hacer que ese campo sea Integer.

Instalación

Para instalarlo es tan sencillo como tirar el siguiente comando

composer require cuyz/valinor

Ejemplo

Imaginemos que tenemos la siguiente estructura de Datos en formato JSON:

{
  "id": 0,
  "isActive": false,
  "name": "Cecelia Richardson",
  "registered": "2015-09-06 03:29:25",
  "messages": [
    {
      "id": 0,
      "text": "eu sint cupidatat deserunt occaecat dolore dolore sit commodo eiusmod",
      "date": "2020-11-16 10:35:09"
    },
    {
      "id": 1,
      "text": "sunt elit pariatur sit pariatur exercitation proident dolor sunt voluptate",
      "date": "2017-03-26 09:15:32"
    },
    {
      "id": 2,
      "text": "Lorem culpa ut ut nostrud anim sint nulla eiusmod laboris",
      "date": "2014-04-14 08:47:00"
    }
  ]
}

Ahora necesitaríamos unas clases que representen la siguiente estructura:

final class User
{
    public function __construct(
        public readonly int $id,
        public readonly bool $isActive,
        public readonly string $name,
        public readonly DateTimeInterface $registered,
        /** @var Message[] */
        public readonly array $messages, 
    ) {}
}

final class Message
{
    public function __construct(
        public readonly int $id,
        public readonly string $text,
        public readonly DateTimeInterface $date,
    ) {}
}

Y ahora es tan sencillo como mapearlo

public function getUser(int $id): Thread
{
    $rawJson = $this->client->request("https://example.com/thread/$id");

    try {   
        return (new \CuyZ\Valinor\MapperBuilder())
            ->mapper()
            ->map(
                User::class,
                new \CuyZ\Valinor\Mapper\Source\JsonSource($rawJson)
            );
    } catch (\CuyZ\Valinor\Mapper\MappingError $error) {
        // Do something…
    }
}

Vanilor se encargará por si solo en devolvernos dicho JSON como objeto.

 

Poco a poco van saliendo librerías que acompañan a las nuevas versiones de PHP y van mejorando el entorno y se va convirtiendo en un lenguaje muy cómodo en el que trabajar.

Esperemos ver más novedades sobre esta librería en el futuro y ver otras grandes ideas como esta.